C++ 解除对堆栈存储对象的对象指针的引用(析构函数调用)

C++ 解除对堆栈存储对象的对象指针的引用(析构函数调用),c++,pointers,memory,destructor,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

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

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
离开时,范围指针变量被销毁。但是,底层对象何时发生变化?是否将其复制到调用方然后销毁?

是。您有一个
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);
 }
因此,当
resultSet
离开时,范围指针变量被销毁

对。该函数返回所述指针的副本

但是,底层对象何时发生变化

没什么。它是动态分配的。动态分配的对象在删除之前一直存在

正在将其复制到调用方

返回的指针在语句中被取消引用

set3 = *set1.unionMS(set2);
然后,将对象复制到
set3
。因此,是的,对象被复制

。。。然后被摧毁

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


在这个例子中使用动态分配似乎没有什么好处。我建议返回自动对象的副本。

这很简单:
/*答案在这里*/
。不客气!什么是
resultSet
?为不清楚而道歉。首先,我无意中从方法中删除了原始粘贴,然后复制粘贴了另一个方法的片段。当前版本是正确的。是的,您正在泄漏内存。您的代码包含
new
,而包含
new
的代码通常会泄漏内存(除非是由专家非常仔细地编写的,这在野外几乎从未发生过)。标题具有误导性。示例代码中没有指向堆栈分配对象的指针。感谢您的回复。因此,如果我理解正确,我将不得不在main中执行以下操作:
MySet*set3
set3=set1.差异(set2)int*MySet
,它是int[]数组。在这种特殊情况下,我认为我必须传递指针,因为否则int*MySet中的值将不会被传递?如果您正确实现了
MySet
的复制和移动构造函数,那么
MySet
的成员所指向的数据将被复制。但是,是的,如果您要使用动态分配,那么您建议的是删除
set3
的正确方法。