我是否在下面显示的代码段中泄漏内存?
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
离开范围时,指针变量被销毁。但是,当发生在底层对象时?它被复制到调用者然后被销毁了吗?
答案 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
,所以对象没有被销毁。取消引用返回的临时指针后,您不能将其存储在任何位置。由于指针的值随后丢失,因此无法再销毁该对象。你已经泄露了记忆。
在此示例中使用动态分配似乎没有任何优势。我建议改为返回自动对象的副本。