【问题标题】:Calling the Constructor after Destructor in a Member Function [duplicate]在成员函数中的析构函数之后调用构造函数[重复]
【发布时间】:2015-08-05 16:52:36
【问题描述】:

看看下面的Reset 函数。我知道为this 调用构造函数和析构函数可能很危险,但是当如下使用时我真的找不到问题所在。我在这里问这个是因为我在 Google 上找不到任何相关材料。我所能找到的只是不要在另一个构造函数中调用构造函数,我显然同意这一点。但是在成员函数的析构函数之后立即调用构造函数不安全吗?

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);
    }
};

【问题讨论】:

标签: c++ constructor destructor placement-new


【解决方案1】:

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

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

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

玩弄构造函数和析构函数不是一个好主意。他们在那里分别引入和移除对象。使用它们而不是这些角色表明您的设计有些问题。另一方面,成员函数也不应该调用其对象的析构函数。即使可行,这仍然是一个设计问题。

【讨论】:

    【解决方案2】:

    这段代码

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

    不好。

    为什么不

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

    或者直接使用std::vector

    【讨论】:

    • std::vector 在我的情况下使用起来太重了。所以我在问“为什么”它不好?
    • 1.为什么太“重”了? 2. 养成调用构造函数/析构函数的习惯是很糟糕的——你会得到意想不到的后果(析构函数/构造函数在幕后做一些事情,比如内存管理)。
    猜你喜欢
    • 1970-01-01
    • 2012-09-28
    • 2014-09-18
    • 2011-12-07
    • 2018-05-13
    • 2011-01-16
    • 2017-09-07
    • 2013-09-06
    • 2011-03-06
    相关资源
    最近更新 更多