【发布时间】:2014-07-22 05:44:28
【问题描述】:
我有以下课程
class CSample
{
char* m_pChar;
double* m_pDouble;
CSample():m_pChar(new char[1000]), m_pDouble(new Double[1000000])
{
}
~CSample()
{
if(m_pChar != NULL) delete [] m_pchar;
if(m_pDouble != NULL) delete [] m_pDouble;
}
};
在我的 main() 函数中,我正在尝试创建 CSample 的对象
int main()
{
try
{
CSample objSample;
}
catch(std::bad_alloc)
{
cout<<"Exception is caught !!! Failed to create object";
}
}
说在构造函数的初始化列表中为 m_pDouble 分配内存时,由于可用内存不足而引发异常。但是对于 m_pChar 它已经分配了。由于没有创建对象本身,因此不会调用析构函数。那么m_pChar 就会出现内存泄漏。
如何避免这种内存泄漏?
【问题讨论】:
-
@jxh 实际上,没有。
std::default_delete对T[]有一个专门化的处理方法。 -
一般来说,要么一个类管理一个资源,要么它有业务相关的方法。试图同时做这两件事会导致灾难。
-
@T.C.:在 ideone 上,我必须传递专业化才能使
unique_ptr使用数组分配。 -
@jxh 好吧,你确实需要
std::unique_ptr<char []>,但你不应该明确传递default_delete<char []>... -
@T.C.:那不是让
unique_ptr存储char (*)[]吗?
标签: c++ memory memory-management memory-leaks