游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3437|回复: 12

碰到一个内存释放的问题,困扰好久了...请高手解决啊~~谢

[复制链接]

7

主题

17

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2007-4-14 13:13: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

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2007-4-14 16:02:00 | 显示全部楼层

Re:碰到一个内存释放的问题,困扰好久了...请高手解决啊~~

写个拷贝构造

Test(const Test& obj)
{
x=obj.x;
y=obj.y;
iptr=new T1;
*iptr=*(obj.iptr);
}

vector里使用了赋值,编译器自动生成的拷贝构造是直接拷贝指针地址的,结果释放就成问题

这个是简单的解决办法,最好是使用对象引用计数机制

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-4-14 18:07:00 | 显示全部楼层

Re:碰到一个内存释放的问题,困扰好久了...请高手解决啊~~

高!

7

主题

17

帖子

28

积分

注册会员

Rank: 2

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

Re:碰到一个内存释放的问题,困扰好久了...请高手解决啊~~

谢谢啊`~我看看~~~~~Thanks~~~~~~

7

主题

17

帖子

28

积分

注册会员

Rank: 2

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

Re:碰到一个内存释放的问题,困扰好久了...请高手解决啊~~

还有个问题啊 :
加了:
释放之前不是判断了吗 ???为什么还错啊 ??
if(!iptr){//这里用非0
delete iptr;
iptr=0
}

0

主题

199

帖子

199

积分

注册会员

Rank: 2

积分
199
发表于 2007-4-15 11:42:00 | 显示全部楼层

Re:碰到一个内存释放的问题,困扰好久了...请高手解决啊~~

这是因为在push_back函数中调用了Test的构造函数
如果没有定义Test的构造函数,那么编译器会自动生成相当于
        Test(const Test& obj)
        {
                x=obj.x;
                y=obj.y;
                iptr=obj.iptr;
        }
的构造函数
而obj.iptr = new T1
所以有两个iptr指向同一个new T1分配的空间
每次Test的构造都会对应一次析构,这个new T1分配的空间就被delete了两次
而在~Test中对obj.iptr置了0,而对另外一个通过Test(const Test&)构造而赋值的iptr没有影响,所以这个iptr无法通过iptr == 0判断出所指向的内存空间已经释放。


6

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2007-4-15 11:58:00 | 显示全部楼层

Re:碰到一个内存释放的问题,困扰好久了...请高手解决啊~~

给你举个简单例子吧

char * pBuff=new char[20];
char * p1=pBuff;
char * p2=p1;

if(p1)
{
  delete[] p1;
  p1=NULL;
}

if(p2)
{
  delete[] p2;
  p2=NULL;
}

以上删除p2就会出错,这下你应该能理解你的问题在那里了吧。

0

主题

199

帖子

199

积分

注册会员

Rank: 2

积分
199
发表于 2007-4-16 10:13:00 | 显示全部楼层

Re:碰到一个内存释放的问题,困扰好久了...请高手解决啊~~

很多人意识不到析构函数的会在函数调用的值传递后执行 —— 我以前也常被这个弄得很头疼

10

主题

84

帖子

84

积分

注册会员

Rank: 2

积分
84
发表于 2007-4-17 20:16:00 | 显示全部楼层

Re:碰到一个内存释放的问题,困扰好久了...请高手解决啊~~

hehe

11

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
发表于 2007-4-18 13:45:00 | 显示全部楼层

Re:碰到一个内存释放的问题,困扰好久了...请高手解决啊~~

我晕倒,还是好好学习了C++再搞游戏开发吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 18:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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