在使用「放置新建」時,建議明確調用構造函數和析構函數。當一個構造函數被顯式調用時,是否構造了構造函數和成員變量?
在這種情況下,在類的初始化部分中初始化的對象是否也會得到正確構造?
顯式調用析構函數也一樣嗎?成員對象是否被正確銷燬?
在使用「放置新建」時,建議明確調用構造函數和析構函數。當一個構造函數被顯式調用時,是否構造了構造函數和成員變量?
在這種情況下,在類的初始化部分中初始化的對象是否也會得到正確構造?
顯式調用析構函數也一樣嗎?成員對象是否被正確銷燬?
在使用「placement new」時,建議明確調用構造函數和析構函數。
我不這麼認爲。它會說你需要明確調用析構函數。
在這種情況下,在類的初始化器部分初始化的對象是否也能正確構造?
除了提供內存之外,所有其他放置方面的新內容都與普通新內容相同。所以不是動態分配內存,而是使用提供的指針。
與顯式調用析構函數相同嗎?
你可以(如果你覺得沒有)在任何對象上顯式調用析構函數。它將像平常一樣調用用戶定義的(或編譯器生成的)類析構函數。您需要明確地爲通過展示位置new創建的對象執行此操作的原因是您可以對這些對象調用delete。這是因爲delete假定對象是在動態分配的內存中創建的,並且在析構函數被調用後嘗試重新循環該內存。
成員對象是否被正確銷燬?
是的。
如果我們認爲新是這樣的:
// not real code
template<class T> T* new(void* location = NULL) (ArgumentsForT)
{
// If you do not provide location (normal usage)
// then we allocate some memory for you.
if (location == NULL)
{ location = malloc(sizeof(T)); // Use of malloc() is just an example
}
((T*)location)->Constructor(ArgumentsForT);
return (T*)location;
}
所以放置新的工作只是像普通新。
望着調用這裏刪除
template<typename T> void delete(T* obj)
{
if (obj != NULL)
{
obj->~T();
free(obj);
}
}
麻煩的是,刪除不能告訴我們,如果內存是由new分配或如果內存是由用戶分配並傳遞到新的(安置新)。所以它總是在內存中調用free。如果您使用placement new,那麼您可能沒有動態分配內存(或者內存仍然用於其他內容)。
char x[sizeof(T)]; // don't do this (memory may not be aligned correctly).
T* obj = new (x) T();
delete obj; // FAIL. The memory was not dynamically allocated.
// Delete will try and re-claim this memory for re-yse
// Even if the memory is local.
// This is why on placement new you need to call the destructor
obj->~T();
在使用「放置新的」它是 建議調用構造函數和析構函數 明確。
這不是正確的說,「你所撥打的構造明確」,爲構造函數沒有名稱($ 12.1/1)。
在這種情況下將物體 一類的初始化部分 初始化也得到妥善 構建?
是的。你爲什麼懷疑它? Pla新僅意味着new
運算符將不會分配任何內存,而是將使用您在新放置中通過的內存來構造對象。該對象在您傳遞的內存中構建。
與明確調用 析構函數相同嗎?成員對象是否正確銷燬 ?
是的。
`建議明確調用構造函數和析構函數`。如何顯式調用構造函數? – Mahesh 2011-01-07 14:58:06
@Mahesh,`void * const pmem = malloc(sizeof(test)); test * const t = new((void *)pmem)test();`和dtor:`t->〜test();`。 – 2011-01-07 15:17:09