在成员函数中的析构函数之后调用构造函数

时间:2015-05-23 20:53:28

标签: c++ constructor destructor placement-new

查看下面的Reset功能。我知道调用this的构造函数和析构函数可能很危险,但是我真的找不到下面的错误。我在这里问这个是因为我找不到任何与谷歌有关的资料。我能找到的就是不要在另一个构造函数中调用构造函数,我显然同意这一点。但是在成员函数中的析构函数之后立即调用构造函数是不安全的?

template<typename T>
class Array{
private:
    T* m_p;

    Array(const Array&);
    Array& operator=(const Array&);

public:
    Array(){
        m_p=0;
    }

    Array(int length):
    m_p(new T[length]){}

    ~Array(){
        delete[] m_p;
    }

    void Reset(int length){
        this->~Array();
        new(this) Array(length);
    }
};

2 个答案:

答案 0 :(得分:1)

即使你最喜欢的实现允许你这样做,这仍然是一个非常糟糕的做法。 你需要考虑的主要是两件事:

  

在构造函数结束之前,对象的构造不正确。

     

调用其析构函数后,不应访问对象。

使用构造函数和析构函数播放技巧不是一个好主意。它们分别用于引入和移除对象。使用它们超过这些角色表明您的设计有些问题。在硬币的另一面,成员函数也不应该调用它的对象的析构函数。即使它有效,它仍然是一个设计问题。

答案 1 :(得分:0)

此代码

void Reset(int length) {
   delete[] m_p;
   m_p = new T[length];
}

很糟糕。

为什么不

std::vector

或只使用In [50]: s = Series(pd.date_range('20000101',freq='D',periods=10000)) In [51]: result = s.where(s.dt.weekday==0,pd.TimedeltaIndex(7-s.dt.weekday,unit='d')+s) In [52]: expected = s.apply(lambda x: x + pd.DateOffset(days=7-x.weekday()) if x.weekday() else x) In [53]: (result==expected).all() Out[53]: True