解除对象指针到堆栈存储对象(析构函数调用)

时间:2016-05-25 22:53:32

标签: c++ pointers memory destructor

我是否在下面显示的代码段中泄漏内存?

MySet.cpp

MySet *MySet::unionMS(MySet& newSet)
{
    MySet *resultSet = new MySet(*this);
    [...] 
    // logic goes here
    [...]
    return resultSet;
}

并在

int main(){
     [...]
     MySet set3;
     set3 = *set1.unionMS(set2);
 }

因此当resultSet离开范围时,指针变量被销毁。但是,当发生在底层对象时?它被复制到调用者然后被销毁了吗?

2 个答案:

答案 0 :(得分:0)

是。您有new且没有匹配的delete。最简单的解决方法是更改​​unionMS以返回MySet而不是MySet*

MySet MySet::unionMS(MySet& newSet)
{
    MySet resultSet(*this);
    [...] 
    // logic goes here
    [...]
    return resultSet;
}

int main(){
     [...]
     MySet set3 = set1.unionMS(set2);
 }

答案 1 :(得分:0)

  

因此,当resultSet离开范围时,指针变量将被销毁。

正确。该函数返回上述指针的副本。

  

然而,当发生在底层对象时?

无。它是动态分配的。动态分配的对象一直存在,直到它们被删除。

  

是否被复制到来电者......

在语句

中取消引用返回的指针
set3 = *set1.unionMS(set2);

然后,该对象被复制到set3。是的,该对象被复制。

  

......然后被摧毁?

不,因为你从未打过delete,所以对象没有被销毁。取消引用返回的临时指针后,您不能将其存储在任何位置。由于指针的值随后丢失,因此无法再销毁该对象。你已经泄露了记忆。

在此示例中使用动态分配似乎没有任何优势。我建议改为返回自动对象的副本。