C++ 在析构函数中delete出现内存储器泄露
C++ 在析构函数中delete出现内存泄露
CConfigDlg::CConfigDlg(CWnd* pParent /*=NULL*/)
: CDialog(CConfigDlg::IDD, pParent)
/*, m_comboCode(_T(""))*/
{
m_addr = new char[128];
memset(m_addr,0,sizeof(m_addr));
}
CConfigDlg::~CConfigDlg()
{
if (m_addr!=NULL) delete []m_addr;
}
代码如上
在对话框退出,执行析构函数时,出现内存泄露,执行delete之前,m_addr地址都正常,这是什么原因?
------解决方案--------------------
检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
------解决方案--------------------
俺有些怀疑楼主是不是理解错了“内存泄露”的概念。
俺感觉楼主这个delete是非法访问内存导致程序崩溃的节奏。
------解决方案--------------------
贴全代码
这里只有一个构造函数,一个析构函数
构造函数new []
析构函数delete []
除非内存分配失败,代码没有任何问题。
------解决方案--------------------
我觉得有一种情况可以假设:
这个指针中间被你重新赋过值,那你这里delete的可能不是你new的东西,所以出错。
------解决方案--------------------
new []
delete []
没有问题,
memset(m_addr,0,sizeof(m_addr));倒是有点问题,不过问题不大。
memset(m_addr,0,sizeof(char)*128);才能把128 字节清0;
只是,这没啥大问题。
所以这里贴出的代码,不是出问题的地方。
CConfigDlg::CConfigDlg(CWnd* pParent /*=NULL*/)
: CDialog(CConfigDlg::IDD, pParent)
/*, m_comboCode(_T(""))*/
{
m_addr = new char[128];
memset(m_addr,0,sizeof(m_addr));
}
CConfigDlg::~CConfigDlg()
{
if (m_addr!=NULL) delete []m_addr;
}
代码如上
在对话框退出,执行析构函数时,出现内存泄露,执行delete之前,m_addr地址都正常,这是什么原因?
c++
内存泄露
对话框
delete
构造
------解决方案--------------------
检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
------解决方案--------------------
俺有些怀疑楼主是不是理解错了“内存泄露”的概念。
俺感觉楼主这个delete是非法访问内存导致程序崩溃的节奏。
------解决方案--------------------
贴全代码
这里只有一个构造函数,一个析构函数
构造函数new []
析构函数delete []
除非内存分配失败,代码没有任何问题。
------解决方案--------------------
我觉得有一种情况可以假设:
这个指针中间被你重新赋过值,那你这里delete的可能不是你new的东西,所以出错。
------解决方案--------------------
new []
delete []
没有问题,
memset(m_addr,0,sizeof(m_addr));倒是有点问题,不过问题不大。
memset(m_addr,0,sizeof(char)*128);才能把128 字节清0;
只是,这没啥大问题。
所以这里贴出的代码,不是出问题的地方。