C++ 内存泄露

HandanXiaoliang 2013-04-15 10:15:21
#include "stdafx.h"
#include <process.h>
class CThreadTest
{
public:
CThreadTest()
{
WaitForSingleObject((HANDLE)_beginthreadex(NULL,0,ThreadFunc,this,0,NULL),INFINITE);
}
~CThreadTest()
{
//位置1
if(m_pUrl)
{
delete m_pUrl;
m_pUrl = NULL;
}
}
char** GetChar(){return &m_pUrl;}
static UINT WINAPI ThreadFunc(PVOID v_pParam)
{
CThreadTest* pTHread = (CThreadTest*)v_pParam;
if(pTHread == NULL)
return 0;

char** pchr = pTHread->GetChar();
*pchr = new char[MAX_PATH];

//位置2
//if(*pchr)
//{
// delete *pchr;
// *pchr = NULL;
//}
return 0;
}
private:
char* m_pUrl;
};

int _tmain(int argc, _TCHAR* argv[])
{
//{
CThreadTest test;
// }
// 包内存溢出
_CrtDumpMemoryLeaks();

return 0;
}


两个问题啊
1、在CThreadTest 类中的线程内部释放动态申请的内存,内存不会泄露,但是在类的析构函数里释放,会有内存泄露呢?
2、如果在main函数里把CThreadTest test加上大括号,不管在线程内部还是析构里,都不会有内存泄露;不加大括号,在类的析构里释放,就会有内存泄露
可是,这都是为啥
...全文
172 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
csd1208 2013-04-15
  • 打赏
  • 举报
回复
说到底 也就是变量的生命周期吧,结束了就会调用析构咯
ynwlgh 2013-04-15
  • 打赏
  • 举报
回复
_CrtDumpMemoryLeaks()这个函数应该在程序的最后调用 . 你上面的程序就这是在程序的最后面调用的. test的生存期还没有结束.你的析构函数没有执行.
int _tmain(int argc, _TCHAR* argv[])
{
     //{
    CThreadTest test;
    // }
    // 包内存溢出
    _CrtDumpMemoryLeaks();
 
    return 0;
}
而你这样写的话,我估计是这个原因,

    {
    CThreadTest test;
    }
    // 包内存溢出
这个test对象的生存 期是在{}之内.
csd1208 2013-04-15
  • 打赏
  • 举报
回复
引用 5 楼 adlay 的回复:
因为如果不加大括号, test 对象的析构是在 _CrtDumpMemoryLeaks 函数运行完了之后去了. 执行 _CrtDumpMemoryLeaks 的时候, 析构函数还没有执行, 内存就没有释放.
楼上正解,主要是注意 _CrtDumpMemoryLeaks函数的的意思,它检查的是当前的内存泄露,也就是说当它执行时, 所有未销毁的对象均会报内存泄漏。
HandanXiaoliang 2013-04-15
  • 打赏
  • 举报
回复
引用 5 楼 adlay 的回复:
因为如果不加大括号, test 对象的析构是在 _CrtDumpMemoryLeaks 函数运行完了之后去了. 执行 _CrtDumpMemoryLeaks 的时候, 析构函数还没有执行, 内存就没有释放.
多谢 很有可能 哈哈
www_adintr_com 2013-04-15
  • 打赏
  • 举报
回复
因为如果不加大括号, test 对象的析构是在 _CrtDumpMemoryLeaks 函数运行完了之后去了. 执行 _CrtDumpMemoryLeaks 的时候, 析构函数还没有执行, 内存就没有释放.
HandanXiaoliang 2013-04-15
  • 打赏
  • 举报
回复
引用 2 楼 AfterSeptember 的回复:
你那是静态函数吧,不属于类的成员函数,怎么能在析构函数里释放内存呢。
静态函数只是去申请内存,申请的内存,还是保存在类的对象中的; 关键问题是,不管谁申请的,谁不能释放?
HandanXiaoliang 2013-04-15
  • 打赏
  • 举报
回复
引用 1 楼 starytx 的回复:
m_pUrl没有初始化
现在不能修改发的帖子了,我刚加了在构造函数里,给m_pUrl = NULL,还是跟之前结果一样
未注销 2013-04-15
  • 打赏
  • 举报
回复
你那是静态函数吧,不属于类的成员函数,怎么能在析构函数里释放内存呢。
starytx 2013-04-15
  • 打赏
  • 举报
回复
m_pUrl没有初始化

65,186

社区成员

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

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