2011-01-07 118 views
0

在使用「放置新建」時,建議明確調用構造函數和析構函數。當一個構造函數被顯式調用時,是否構造了構造函數和成員變量?

在這種情況下,在類的初始化部分中初始化的對象是否也會得到正確構造?

顯式調用析構函數也一樣嗎?成員對象是否被正確銷燬?

+0

`建議明確調用構造函數和析構函數`。如何顯式調用構造函數? – Mahesh 2011-01-07 14:58:06

+0

@Mahesh,`void * const pmem = malloc(sizeof(test)); test * const t = new((void *)pmem)test();`和dtor:`t->〜test();`。 – 2011-01-07 15:17:09

回答

1

在使用「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(); 
2

在使用「放置新的」它是 建議調用構造函數和析構函數 明確。

這不是正確的說,「你所撥打的構造明確」,爲構造函數沒有名稱($ 12.1/1)。

在這種情況下將物體 一類的初始化部分 初始化也得到妥善 構建?

是的。你爲什麼懷疑它? Pla新僅意味着new運算符將不會分配任何內存,而是將使用您在新放置中通過的內存來構造對象。該對象在您傳遞的內存中構建。

與明確調用 析構函數相同嗎?成員對象是否正確銷燬 ?

是的。

相關問題