取消引用对象指针到堆栈存储的对象(析构函数调用)

Dereferencing object pointer to stack stored object (destructor call)

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

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 更改为 return a MySet 而不是 MySet*.

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

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

So when resultSet leaves the scope pointer variable is destroyed.

正确。函数 returns 提到的指针的副本。

However, when happens to the underlying object?

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

Is it being copied to the caller...

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

set3 = *set1.unionMS(set2);

然后,对象被复制到set3。所以是的,对象被复制了。

... and then destroyed?

不,因为您从未调用过 delete,所以对象没有被销毁。取消引用返回的 temporary 指针后,您不会将其存储在任何地方。因为指针的值随后丢失,对象不能再被销毁。你泄露了内存。

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