2014-10-31 98 views
3

我有一個靜態分配的對象。此對象沒有operator=,我需要重建它。重新調用靜態分配對象的構造函數

所以,這確實爲我工作:

myObj = T(...); 

我目前的做法是:

myObj.~T() 
new(&myObj) T(...); 

但感覺錯了,所以我想知道是否有任何陷阱,我我在這裏失蹤。

+8

如果你真的必須的話,這是做到這一點的方法。但海事組織的問題是導致你必須這樣做的設計決定。你不能有一個像'reset()'或其他成員函數嗎? – jrok 2014-10-31 17:23:09

+1

*如何靜態分配? 'const'合格? – Deduplicator 2014-10-31 17:23:15

+2

您可以改爲使用靜態unique_ptr,並在指針中分配一個新對象。 – 2014-10-31 17:24:34

回答

1

如果對象是靜態分配的,你想重新分配它,而不訴諸UB,最好的辦法是採取範圍的控制,並決定

  1. 當最新的,你可以等到你應該分配對象
  2. 當最早的,你應該釋放對象

爲了更好地理解它,讓我們考慮一個例子

void foo() 
{ 
    { 
    Foo obj(...); // obj gets allocated 
    // Code which uses obj 
    } // obj gets automatically de-allocated 
    { 
    Foo obj; // obj gets allocated (default constructed) 
    // Code which uses obj 
    } // obj gets automatically de-allocated 
} 
1

將對象創建爲std::experimental::optional,現在可以隨意重新創建對象。請記住在每次使用前確保它存在。

boost也有這樣的一個類,根據我的經驗,你也可以推出自己的可選項。