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)然后在main离开作用域之前显式删除set3。按值返回的问题是MySet持有一个动态分配的int*MySet
,它是int[]数组。在这种特殊情况下,我认为我必须传递指针,因为否则int*MySet中的值将不会被传递?如果您正确实现了MySet
的复制和移动构造函数,那么MySet
的成员所指向的数据将被复制。但是,是的,如果您要使用动态分配,那么您建议的是删除set3
的正确方法。