說我有以下幾點:這是否會導致內存問題?
Foo* foo = new Foo(bar);
//later on
*foo = Foo(anotherBar);
既然foo是在堆上分配這是否會引發問題或者會從臨時富內存複製到富的堆上的地址?
由於
說我有以下幾點:這是否會導致內存問題?
Foo* foo = new Foo(bar);
//later on
*foo = Foo(anotherBar);
既然foo是在堆上分配這是否會引發問題或者會從臨時富內存複製到富的堆上的地址?
由於
*foo = Foo(anotherBar);
不大於常規分配到Foo
類型的對象不同。 *foo
返回Foo類型的左值,並且您正在分配給它。
簡答題:它不會造成問題,臨時會被複制到foo
指向的堆Foo
對象中。
稍後您仍然需要'刪除foo'。我們假設'Foo'的賦值操作符正確實現並釋放原始對象可能正在管理的任何資源。 – Praetorian
...除非您的賦值操作符泄漏數據... – bitmask
...或者Foo以奇怪的方式覆蓋新的運算符或......或......或許應考慮在C++中的其他許多事物 –
只要您記得在某個時候刪除foo,那不會導致內存泄漏。
如果你不能肯定的是,賦值操作符會做正確的事情,你可以考慮手動刪除和重建不釋放內存:
foo->~Foo();
foo = new (foo) Foo(anotherBar);
我肯定不會推薦這款,它的非直覺和不雅,但我想我把它放在那裏,以防萬一有人真的想避免由delete
和單獨的new
帶來的重新分配和重新分配。
當然,避免使用new
完全贊成資源管理容器。
使用相同指針在運行時創建2個選項。 當它指向第二個內存位置,因此我們沒有辦法訪問 第一個對象,以釋放它回到堆,因此mem泄漏。
這是不正確的。第二個創建的對象是臨時的,* not *通過new分配。第一個對象被解除引用,所以賦值不是指針賦值。 **指針指向的地址不會改變** – Flexo
另請參閱:http://stackoverflow.com/questions/222557/cs-placement-new – DuckMaestro