创建类变量期间发生内存泄漏

莎丽丝

使用来自运算符重载内存泄漏的答案,我添加了复制构造函数和复制赋值运算符,按照NathanOliver的建议更改了operator +(),现在我将传递给构造函数静态数组。仍然有内存泄漏,奇怪的是,即使在主目录中只有类变量初始化时,我还是得到了此内存泄漏,是否与参数无关...有什么建议吗?我认为讲师是有效的。

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;
 }

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

创建类变量期间发生内存泄漏

来自分类Dev

Delphi:在类内创建TStringList时发生内存泄漏

来自分类Dev

扩展类时发生内存泄漏

来自分类Dev

Glib:创建GDBusProxy时发生内存泄漏

来自分类Dev

使用AutomationElement类时可能发生内存泄漏

来自分类Dev

注入类而不是实例时发生内存泄漏?

来自分类Dev

用熊猫创建缓冲区时发生内存泄漏?

来自分类Dev

用Java创建对象的最佳方法,何时发生内存泄漏

来自分类Dev

Hibernate实体持续存在期间发生巨大的内存泄漏,为什么?

来自分类Dev

Hibernate实体持续存在期间发生巨大的内存泄漏,为什么?

来自分类Dev

继承的类内存泄漏

来自分类Dev

声明变量内存泄漏

来自分类Dev

如何迅速发生内存泄漏?

来自分类Dev

使用matplotlib发生内存泄漏

来自分类Dev

Android WebView发生内存泄漏

来自分类Dev

扩展类时内存泄漏

来自分类Dev

Android 内存泄漏 - 匿名类

来自分类Dev

从函数返回xmlChar后发生内存泄漏

来自分类Dev

使用getline和strsep发生内存泄漏

来自分类Dev

这段代码中如何发生内存泄漏

来自分类Dev

使用NodeJS时发生内存泄漏

来自分类Dev

调用NSUserDefaults setObject时发生内存泄漏

来自分类Dev

通过FinalizerReference可能发生的内存泄漏

来自分类Dev

Vulkan:渲染时发生内存泄漏

来自分类Dev

添加列表值时发生内存泄漏

来自分类Dev

Apple示例项目PhotoMap发生内存泄漏

来自分类Dev

以下C代码是否发生内存泄漏?

来自分类Dev

使用实体框架时发生内存泄漏

来自分类Dev

通过使用watchEvent发生内存泄漏