c++构造函数类中的内存泄漏
Memory leak in class Constructor of c++
我有以下类
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就会有内存泄漏。
如何避免内存泄漏?使用vector
可以很容易地避免这种问题。
class CSample
{
std::vector<char> m_pChar;
std::vector<double> m_pDouble;
CSample():m_pChar(1000), m_pDouble(1000000)
{
}
};
一般来说,应该以编写不需要析构函数的类为目标。这使得他们简单地遵守"三原则"。
有几种安全的方法:
-
将内存管理委托给其他类,如
std::unique_ptr
(c++ 11)或std::vector
:class CSample { std::unique_ptr<char []> m_pChar; std::unique_ptr<double []> m_pDouble; CSample():m_pChar(new char[1000]), m_pDouble(new double[1000000]) { } };
语言保证,如果抛出异常,任何已经构造的类成员都将被销毁,这将释放已分配的内存。
-
在构造函数体中执行内存分配,并使用本地try块:
class CSample { char* m_pChar; double* m_pDouble; CSample() : m_pChar(nullptr), m_pDouble(nullptr) { try { m_pChar = new char[1000]; m_pDouble = new double[1000000]; } catch(...){ if(m_pChar) delete [] m_pChar; if(m_pDouble) delete [] m_pDouble; throw; } } CSample(const CSample &other) { /* perform deep copy */ } CSample &operator=(const CSample &other) { /* perform deep copy of other and release my resources */ } ~CSample() { if(m_pChar) delete [] m_pchar; if(m_pDouble) delete [] m_pDouble; } };
-
使用c++ 11委托构造函数。当目标(非委托)构造函数完成执行时,对象被视为已构造,因此如果委托构造函数稍后抛出,则将调用析构函数。
class CSample { char* m_pChar; double* m_pDouble; CSample(int) : m_pChar(nullptr), m_pDouble(nullptr) { } CSample() : CSample(0) { m_pChar = new char[1000]; m_pDouble = new double[1000000]; } CSample(const CSample &other) { /* perform deep copy */ } CSample &operator=(const CSample &other) { /* perform deep copy of other and release my resources */ } ~CSample() { if(m_pChar) delete [] m_pchar; if(m_pDouble) delete [] m_pDouble; } };
如果不将资源管理委托给另一个类,则还需要提供适当的复制构造函数和复制赋值操作符,因为默认的(按成员复制/赋值)具有错误的语义。显然,第一种方法是最简单的,也是最不容易出错的。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏