2014-10-31 78 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也有这样的一个类,根据我的经验,你也可以推出自己的可选项。