取消引用对象指针到堆栈存储的对象(析构函数调用)
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 指针后,您不会将其存储在任何地方。因为指针的值随后丢失,对象不能再被销毁。你泄露了内存。
在这个例子中使用动态分配似乎没有任何优势。我建议改为返回自动对象的副本。
我是否在下面显示的代码片段中泄漏了内存?
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 指针后,您不会将其存储在任何地方。因为指针的值随后丢失,对象不能再被销毁。你泄露了内存。
在这个例子中使用动态分配似乎没有任何优势。我建议改为返回自动对象的副本。