2015-05-23 107 views
0

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

相关:[我可以得到一个新的开始在C++没有失败再次?](http://stackoverflow.com/q/8829548/33499) – wimh

回答

0

此代码

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

是坏的。

为什么不

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

或只使用std::vector

+0

'std :: vector'是太重了,在我的情况下使用。所以我问'为什么'这是不好的? – xiver77

+2

1.为什么它太“重”? 2.调用构造函数/析构函数的习惯是坏的 - 你会得到意想不到的后果(析构函数/构造函数在内存管理等幕后操作)。 –

1

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

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

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

玩弄构造函数和析构函数不是一个好主意。他们分别介绍和删除对象。使用它们不仅仅是这些角色表明你的设计有些问题。在硬币的另一面,成员函数也不应该调用它的对象的析构函数。即使它有效,它仍然是一个设计问题。

相关问题