游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3013|回复: 7

碰到一个内存释放的问题,望高手看看..搞不定啊~~~~谢谢

[复制链接]

7

主题

17

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2007-4-14 13:59:00 | 显示全部楼层 |阅读模式
碰到一个内存释放的问题,望高手看看..搞不定啊~~~~
源代码如下:
#include <iostream.h>
#include <vector>
using namespace std;
class T1
{
public:
int x,y;
};

class Test
{
public:
int x,y;
T1* iptr;

Test():x(1),y(1)
{
iptr=0;
}

    ~Test()
{
if(iptr)
delete iptr;  ///这里老是出错..
}
};

vector<Test> vc;

void test()
{
   Test tt;
           tt.iptr=new T1;
vc.push_back(tt);
}
void main()
{
test();
}

6

主题

99

帖子

99

积分

注册会员

Rank: 2

积分
99
发表于 2007-4-14 19:19:00 | 显示全部楼层

Re:碰到一个内存释放的问题,望高手看看..搞不定啊~~~~谢谢

void test()
{
   Test tt;
   tt.iptr=new T1;
   vc.push_back(tt);
}
其执行流程如下:
1。调用Test构造函数,构造tt,iptr = 0;
2。创建T1,iptr = &T1
3。vc创建一个自身数据Test,复制tt的数据到里面,即Test data = tt;
4。tt释构,delete iptr,把T1删除了,但vc中的数据的指针iptr仍指向T1。
5。main()结束时,vc释构,再次要调用Test的释构函数,delete iptr,出错,因为对象已经删除。
End。
请注意vector的执行。

7

主题

17

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2007-4-14 21:06:00 | 显示全部楼层

Re:碰到一个内存释放的问题,望高手看看..搞不定啊~~~~谢谢

谢谢啊 ~~~

16

主题

114

帖子

114

积分

注册会员

Rank: 2

积分
114
发表于 2007-4-15 17:50:00 | 显示全部楼层

Re:碰到一个内存释放的问题,望高手看看..搞不定啊~~~~谢谢

vector 里尽量放指针,这样效益更高。

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2007-4-15 22:14:00 | 显示全部楼层

Re:碰到一个内存释放的问题,望高手看看..搞不定啊~~~~谢谢

浅拷贝引起的

另外:
if(iptr) 这句不是必须的,delete可以处理null的情况
delete iptr;

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2007-4-27 14:21:00 | 显示全部楼层

Re:碰到一个内存释放的问题,望高手看看..搞不定啊~~~~谢谢

自由蜂正解

PS,std::container是以value copy的形式在操作,所以,请确定这种行为是你所期望的。

0

主题

202

帖子

202

积分

中级会员

Rank: 3Rank: 3

积分
202
发表于 2007-6-19 00:52:00 | 显示全部楼层

Re:碰到一个内存释放的问题,望高手看看..搞不定啊~~~~谢谢

[em1]

3

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2009-9-28 17:01:00 | 显示全部楼层

Re:碰到一个内存释放的问题,望高手看看..搞不定啊~~~~谢谢

void test()
{
   Test tt;
           tt.iptr=new T1;
vc.push_back(tt);
}

tt是临时变量, 在离开此函数之前会被释构, 所以iptr所指对象会被删除.
同时, iptr会成为野指针, 在再次使用时就会exception,,
最好在delete iptr时, 使iptr=0;

push_back(class), 会产生, 很多你意想不到的后果, 效率问题(class会自复制), 及自复制产生的问题... 就不多说了,
所以最好改成& or *, 且最好加上 const

其实LZ要做的是, 学习一下<<C++高质量编程>>
当一个对象具有指针时, 要谨慎他的 赋值构造函数 及 COPY构造函数.
因为编译器在生成对象时, 如果你没有这两个函数, 会自动生成一个,
所以, 该对象的指针是会被复制的, 但指针所指的内容不会被复制.


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-20 11:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表