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

Calling the Constructor after Destructor in a Member Function

本文关键字:之后 调用 构造函数 析构函数 成员 函数      更新时间:2023-10-16

请看下面的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);
    }
};

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

对象直到构造函数结束才被正确构造。

对象在调用析构函数后不应该被访问。

玩弄构造函数和析构函数不是一个好主意。它们分别是用来引入和移除物体的。使用它们多于使用这些角色表明您的设计有些问题。另一方面,成员函数也不应该调用其对象的析构函数。

此代码

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

是坏的。

为什么不

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

或者直接用std::vector