首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >创建类变量时的内存泄漏

创建类变量时的内存泄漏
EN

Stack Overflow用户
提问于 2015-11-11 12:27:17
回答 1查看 327关注 0票数 3

使用来自operator overloading memory leak的答案,我添加了复制构造函数和复制评估操作符,按照NathanOliver的建议更改了operator+(),现在我要传递构造函数静态数组。还有内存泄漏和奇怪的事情是,我得到了这个内存泄漏,即使在主要只有类变量初始化时,不管是否有参数.有什么建议吗?我认为狡诈者是有效的。

代码语言:javascript
代码运行次数:0
运行
复制
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编译器.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-11 12:41:39

c++中有两种拷贝:浅拷贝和深拷贝。第一个只复制指针,后者复制值。默认情况下,如果编译器生成复制构造函数和重载赋值操作符,则执行浅拷贝。现在让我们看看您的代码。

代码语言:javascript
代码运行次数:0
运行
复制
Set::Set(int n, int* array){
   number = n; 
   elems = array;
   std::sort(elems, elems + number);
}

此构造函数接受一个in数组。如果这个数组是使用new在堆上分配的,那么应该使用delete[]解除它的分配。现在声明:

代码语言:javascript
代码运行次数:0
运行
复制
 elems = array;

是一个浅拷贝,它实际上是复制指针而不是值。因此,如果在main中意外删除数组,那么elem将成为一个悬空指针,因为它将指向已删除的数组。在此之后,删除或删除elem将具有未定义的行为。

同样的情况也适用于此:

代码语言:javascript
代码运行次数:0
运行
复制
Set& operator=(const Set& X){

   if(this==&X)
   return *this;
   delete [] elems;
   elems=X.elems;
   number=X.number;
   return *this;
}

你再做一次浅薄的复制,你只需复制指针。为了解决这个问题你需要

代码语言:javascript
代码运行次数:0
运行
复制
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

最后,向类添加一个类析构函数:

代码语言:javascript
代码运行次数:0
运行
复制
~Set() {
     if(elems != nullptr) //check for empty array
         delete[] elems;
 }

请记住,c++的创建者说,您应该遵循RIII (称为RIII)。基本上,在创建类时,始终在构造函数中使用新的构造函数,在析构函数中使用删除。避免任何其他功能中的新/删除。传递指针可能很棘手。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33650535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档