我很抱歉,如果我錯過了一個重要的點,這是在某種程度上隱含在問題中,我沒有看到它。但是,對於這中線:
std::auto_ptr<Base> p(new((void*)(new char[size])) Packet());
這是我覺得能一下說:
末的構造函數調用應該是Packet
,不Packet()
,但在實踐中,編譯器可能會接受它,它可能沒有任何區別
內部分配new char[size]
使用數組分配器new []
。關於表達new [array_n]
的CPP reference狀態:
注意,多於size_of(型)* array_n可能由於由編譯器(如陣列的大小編碼的附加信息被分配,因爲該信息以便正確地破壞陣列中的物體)。現在
,外部分配器通話,new ((void*)(...))
,是安置新,被描述here如下的實例:
void* operator new (std::size_t, void* ptr);
什麼都不做,返回PTR。
換句話說,它可能發生該呼叫到new []
使編譯器分配比由陣列和在額外的空間編碼大小有關的信息嚴格要求更多的存儲器。但是,由於展示位置新功能「無」,因此不會以任何方式處理或刪除額外信息。
但是,因爲使用的std::auto_ptr
意味着該解除分配將利用delete
(和不delete []
)來進行,該額外的信息將無法正確釋放,因此內存泄漏或更差可能導致。
編輯:爲了避免僅依賴於CPP的參考,C++ Standard N3337的相關部分如下:
- §只有
delete
應當用於釋放空間,通過new
分配18.6.1.2狀態,並且相應delete []
分配的空間由new []
- §18.6.1.3明確指出
new
和new []
的佈局表單不執行任何操作。這意味着它們都不能用於將單個對象空間「轉換」爲數組空間。
現在也許真正的問題是如果只delete []
使用後解除分配的空間放置新的問題所提出的申請是否有效。也許答案是不確定的(這應該被解釋爲等同於「否」)。
我有一種感覺[這個問題](http://stackoverflow.com/q/5520591/500104)是非常相關的。 – Xeo 2012-03-15 05:21:53
對不起,如果我誤解這裏的東西。但是,你基本上問是否可以使用'delete'(而不是'delete []')來釋放使用'new []'分配的內存? – jogojapan 2012-03-15 06:44:52