Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重新调用静态分配对象的构造函数_C++ - Fatal编程技术网

C++ 重新调用静态分配对象的构造函数

C++ 重新调用静态分配对象的构造函数,c++,C++,我有一个静态分配的对象。这个对象没有操作符=,我需要重建它 所以,这对我来说并不管用: myObj = T(...); 我目前的做法是: myObj.~T() new(&myObj) T(...); 但是感觉不对,所以我想知道这里是否有我遗漏的陷阱。如果一个对象是静态分配的,并且您希望在不诉诸UB的情况下重新分配它,那么最好的办法就是控制范围并决定 最晚在什么时候,您可以等待,直到您应该分配对象 最早什么时候你应该释放这个物体 为了更好地理解它,让我们考虑一个例子 void foo(

我有一个静态分配的对象。这个对象没有
操作符=
,我需要重建它

所以,这对我来说并不管用:

myObj = T(...);
我目前的做法是:

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

但是感觉不对,所以我想知道这里是否有我遗漏的陷阱。

如果一个对象是静态分配的,并且您希望在不诉诸UB的情况下重新分配它,那么最好的办法就是控制范围并决定

  • 最晚在什么时候,您可以等待,直到您应该分配对象
  • 最早什么时候你应该释放这个物体
  • 为了更好地理解它,让我们考虑一个例子

    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
    }
    
    将对象创建为对象,现在可以随意重新创建它。每次使用之前,请记住确保它存在


    boost
    也有这样一个类,根据我的经验,您也可以推出自己的可选功能。

    如果您真的必须这样做,这是一种方法。但在我看来,问题在于设计决策导致你不得不这么做。你不能有一个像
    reset()
    之类的成员函数吗?它是如何静态分配的
    const
    -合格?您可以使用一个静态唯一\u ptr,并在指针中分配一个新对象。如果
    new
    抛出,则该对象将不存在,当它在程序结束时自动销毁时,会给出未定义的行为。显然,构造函数会做一些您希望做两次的事情(或更经常)。您的问题太模糊,无法给出具体的解决方案,但您解决此问题的长期目标应该是将功能从构造函数中移出,转移到可以随时调用的正常函数中。尝试重新调用构造函数只不过是修复设计问题的症状。