2011-09-14 109 views
3

說我有以下幾點:這是否會導致內存問題?

Foo* foo = new Foo(bar); 

//later on 
*foo = Foo(anotherBar); 

既然foo是在堆上分配這是否會引發問題或者會從臨時富內存複製到富的堆上的地址?

由於

+0

另請參閱:http://stackoverflow.com/questions/222557/cs-placement-new – DuckMaestro

回答

10

*foo = Foo(anotherBar);不大於常規分配到Foo類型的對象不同。 *foo返回Foo類型的左值,並且您正在分配給它。

簡答題:它不會造成問題,臨時會被複制到foo指向的堆Foo對象中。

+9

稍後您仍然需要'刪除foo'。我們假設'Foo'的賦值操作符正確實現並釋放原始對象可能正在管理的任何資源。 – Praetorian

+0

...除非您的賦值操作符泄漏數據... – bitmask

+0

...或者Foo以奇怪的方式覆蓋新的運算符或......或......或許應考慮在C++中的其他許多事物 –

1

如果Foo在堆上分配任何東西,它將不會被釋放,因爲第一個實例的析構函數不會被調用。

+0

您的意思是析構函數而不是構造函數?如果它有一個析構函數,[C++ rule of three](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three/4172961#4172961)表明它也應該有一個賦值運算符也正因爲如此。 – Flexo

+0

bluh?是的,這就是我的意思! – mkb

1

如果你不能肯定的是,賦值操作符會做正確的事情,你可以考慮手動刪除和重建不釋放內存:

foo->~Foo(); 
foo = new (foo) Foo(anotherBar); 

我肯定不會推薦這款,它的非直覺和不雅,但我想我把它放在那裏,以防萬一有人真的想避免由delete和單獨的new帶來的重新分配和重新分配。

當然,避免使用new完全贊成資源管理容器。

-1

使用相同指針在運行時創建2個選項。 當它指向第二個內存位置,因此我們沒有辦法訪問 第一個對象,以釋放它回到堆,因此mem泄漏。

+0

這是不正確的。第二個創建的對象是臨時的,* not *通過new分配。第一個對象被解除引用,所以賦值不是指針賦值。 **指針指向的地址不會改變** – Flexo

相關問題