创建类变量时内存泄漏
memory leak during creating class variable
使用运算符重载内存泄漏的答案我添加了复制构造函数和复制辅助运算符,按照NathanOliver的建议更改了运算符+(),现在我将传递给构造函数静态数组。仍然存在内存泄漏,奇怪的是,即使主要只有类变量初始化,我也会出现内存泄漏,不管是否有参数。。。有什么建议吗?我认为cunstructor是有效的。
Set::Set(int n, int* array){
number = n;
elems = array;
std::sort(elems, elems + number);
}
Set::Set(const Set& s){
number=s.number;
elems=s.elems;
}
Set& operator=(const Set& X){
if(this==&X)
return *this;
delete [] elems;
elems=X.elems;
number=X.number;
return *this;
我使用gcc(tdm64-2)4.8.1编译器。
c++中有两种拷贝,浅拷贝和深拷贝。第一个只复制指针,后面的复制值。默认情况下,如果由编译器生成,复制构造函数和重载赋值运算符将执行浅复制。现在让我们来看看您的代码。
Set::Set(int n, int* array){
number = n;
elems = array;
std::sort(elems, elems + number);
}
此构造函数接受一个in数组。如果这个数组是使用new在堆上分配的,那么应该使用delete[]来解除分配。现在声明:
elems = array;
是一个浅拷贝,它实际上拷贝的是指针而不是值。所以,如果您不小心在main中删除了数组,那么elem
将成为一个悬空指针,因为它将指向一个已删除的数组。在此之后取消引用或删除elem
将具有未定义的行为。
现在同样适用于此:
Set& operator=(const Set& X){
if(this==&X)
return *this;
delete [] elems;
elems=X.elems;
number=X.number;
return *this;
}
你再做一次浅层复制,你只是复制指针。为了解决这个问题,你需要
delete[] elems;
elems = new int[n]; //where n is x.elems length
//use memcpy() function or a for loop to copy the values of x.elems
最后在类中添加一个类析构函数:
~Set() {
if(elems != nullptr) //check for empty array
delete[] elems;
}
记住bjarnestroustrup,c++的创建者说你应该遵循RIII(称为R tripple i)。基本上,当你创建一个类时,总是在构造函数中使用new,在析构函数中使用delete。避免在任何其他功能中新建/删除。传球可能很棘手。
相关文章:
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存