请教一个资源释放问题。

niatguomin 2010-01-20 05:50:21

class A
{
public:
int * m_pi;
A()
{
m_pi = new int;
}
~A()
{
delete m_pi;
m_pi = 0;
}
void clean()
{
delete m_pi;
m_pi = 0;
}
};

int main()
{
A* pa=new A();

pa->clean(); //m_pi = 0;

delete pa; //m_pi 未定义。
pa = NULL;

return 0;
}


工具是vs2005,我发现在调用clean后,m_pi = 0;然后delete pa后,m_pi是两个??,其实肯定是一些值,我查到的是0xfeeefeee,是否可以这样理解,delete资源后,这个对象的控制已经结束,对象的内容其实编译器已经重新写入内容了?我通过内存,发现clean后,前4个字节全部为0,delete pa后,就有数据了,当然这个数据是乱的。
...全文
204 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
superlee19 2010-01-21
  • 打赏
  • 举报
回复
C++中,delete一个地址为0的指针不会有任何错误!!!!!!!!!
Sephoenix 2010-01-21
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
hacker1125 2010-01-21
  • 打赏
  • 举报
回复
delete了两回了,肯定不对。
不过建议delete 后,最好设置指针为NULL或者对象为0
wyjjsn 2010-01-21
  • 打赏
  • 举报
回复
delete了两回。
huanyuxiake 2010-01-21
  • 打赏
  • 举报
回复
把析构函数的去掉,,直释放一次就可以了
sjgh_1314 2010-01-21
  • 打赏
  • 举报
回复
class A
{
public:
int * m_pi;
A()
{
m_pi = new int;
}
~A()
{
if(!m_pi)
{
delete m_pi;
m_pi = 0;
}
}//一般这么做吧
void clean()
{
delete m_pi;
m_pi = 0;
}
};

int main()
{
A* pa=new A();

pa->clean(); //m_pi = 0;

delete pa; //m_pi 未定义。
pa = NULL;

return 0;
}
lwhwei 2010-01-21
  • 打赏
  • 举报
回复
删除了两次m_pi 如果你要调用clean 那就要在虚构函数里判断一下m_pi是否为空
niatguomin 2010-01-21
  • 打赏
  • 举报
回复
其实不是删除指针的缘故,而是使用了野指针。这个问题我已经解决了,谢谢各位。开贴的时候,分数设置太少了,要是不够,我重新开贴给大家分。
niatguomin 2010-01-20
  • 打赏
  • 举报
回复
其实本不会产生这个问题,在 WM_CLOSE里面,虽然加了DestroyWindow(m_hWnd);还是没有马上结束消息循环,所以才不得不加个m_pflash变量来判断是否已经结束了循环
niatguomin 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 pengzhixi 的回复:]
引用 19 楼 niatguomin 的回复:
在CFlashDlg的析构函数里面,我并没有做什么事情。是在wm_close里面释放了m_pflash指针。


万一你"wm_close里面释放了m_pflash指针"这段没有执行怎么办?那就会有内存泄露

[/Quote]
今天为了解决这个资源泄漏问题,没想到耗费这么多时间。
traceless 2010-01-20
  • 打赏
  • 举报
回复
delele p; //p = NULL, 是没有问题的,是很标准的

问题在LZ你删除的是野指针,是在你的源程序里,不是这个帖子的代码
pengzhixi 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 niatguomin 的回复:]
在CFlashDlg的析构函数里面,我并没有做什么事情。是在wm_close里面释放了m_pflash指针。
[/Quote]

万一你"wm_close里面释放了m_pflash指针"这段没有执行怎么办?那就会有内存泄露
niatguomin 2010-01-20
  • 打赏
  • 举报
回复
在CFlashDlg的析构函数里面,我并没有做什么事情。是在wm_close里面释放了m_pflash指针。
pengzhixi 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 niatguomin 的回复:]
引用 15 楼 tony_chenypc 的回复:
不会吧,对p = NULL随便删除多少次都没问题的。


问题就是这里,如果delete一次,那么导致 m_pflash不为0了。
16楼,加个判断其实一样的,因为如果null的话,应该不做什么事情。
[/Quote]
你不是在那个while循环里面将m_pflash置0了吗
niatguomin 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 tony_chenypc 的回复:]
不会吧,对p = NULL随便删除多少次都没问题的。
[/Quote]

问题就是这里,如果delete一次,那么导致 m_pflash不为0了。
16楼,加个判断其实一样的,因为如果null的话,应该不做什么事情。
pengzhixi 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 niatguomin 的回复:]
引用 12 楼 cattycat 的回复:
m_pi 都不是A的数据成员,在哪定义的?
你delete两遍的话,肯定会存在不确定因素

我找了好几遍,没有其他地方释放过资源。
[/Quote]
你直接在析构函数里面先判断指针是否是空指针,如果是空指针就不释放,否则就释放
tony_chenypc 2010-01-20
  • 打赏
  • 举报
回复
不会吧,对p = NULL随便删除多少次都没问题的。
niatguomin 2010-01-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 cattycat 的回复:]
m_pi 都不是A的数据成员,在哪定义的?
你delete两遍的话,肯定会存在不确定因素
[/Quote]
我找了好几遍,没有其他地方释放过资源。
niatguomin 2010-01-20
  • 打赏
  • 举报
回复

class CEngineApp
{
public:
CEngineApp();
~CEngineApp();

public:
CFlashDlg * m_pFlashDlg;
};

CEngineApp::CEngineApp()
,m_pFlashDlg(NULL)
{
}

CEngineApp::~CEngineApp()
{
//delete m_pFlashDlg;
//m_pFlashDlg = NULL;
}

class CFlashDlg
{
public:
CFlashDlg();
virtual ~CFlashDlg(){}

void DlgCreateWindow(WNDPROC lpfnWndProc);
LRESULT ThreadProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp);

protected:
CFlash * m_pflash;
};

void CFlashDlg::DlgCreateWindow(WNDPROC lpfnWndProc)
{
//create windows
//....

MSG msg;
ZeroMemory(&msg,sizeof(MSG));
while(msg.message != WM_QUIT)
{
if(GetMessage(&msg,NULL,0U,0U))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if ( m_pflash != 0)
m_pflash->Update();
}
}
}

LRESULT CFlashDlg::ThreadProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{
PAINTSTRUCT ps;
HDC hdc;
int wmId, wmEvent;
UINT ev = (UINT) wp;
switch(msg)
{
case WM_CLOSE:
if ( m_pflash != 0)
{
m_pflash->Stop();
delete m_pflash;
m_pflash = 0;
}
DestroyWindow(m_hWnd);
break;
default:
return DefWindowProc(hWnd, msg, wp, lp);
}
return DefWindowProc(hWnd,msg,wp,lp);
}



问题就是这里,如果不注释掉,那么while循环里面的 m_pflash就不是0了,导致再次执行update
CEngineApp::~CEngineApp()
{
//delete m_pFlashDlg;
//m_pFlashDlg = NULL;
}
cattycat 2010-01-20
  • 打赏
  • 举报
回复
m_pi 都不是A的数据成员,在哪定义的?
你delete两遍的话,肯定会存在不确定因素
加载更多回复(11)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧