在成员函数的析构函数之后调用构造函数
Calling the Constructor after Destructor in a Member Function
请看下面的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
相关文章:
- 在成员构造函数之后调用基类构造函数
- 在类的第一个/最后一个实例存在之前/之后调用一对函数.有没有更好的方法?
- 为什么在编译此代码时会出现此错误?(在~之后调用terminate)
- gtest - 确保方法之前没有被调用,但可以在某个方法调用之后调用
- 如果在 C++ 中的 malloc() 之后调用 free() 则会出现错误
- 为什么在"return 0"之后调用析构函数?
- 是在C 静态初始化之前或之后调用dllgetClassObject
- 对于QProcess,是否需要在waitForFinished之后调用waitForReadyRead
- 可以在 main 的返回 0 语句之后调用任何函数吗?
- 在计算后,在基类之后调用参数化构造函数
- 是在默认构造函数之前或之后调用的初始化列表
- 必须在GetStringUTFChars之后调用ReleaseStringUTFChar(将char*传递给C函数时)
- 在QDialog::exec()之后调用QApplication::exec.()
- 内部类析构函数在基类析构函数之后调用
- 为什么在pthread_detach()之后调用pthread_exit()时,在极少数情况下会导致SEGV
- 在简单继承之后调用复制构造函数
- setOverrideCursor(Qt::WaitCursor) 如果在消息框之后调用,则不起作用
- 在 LockFileEx 之后调用 ReadFile 时崩溃
- 在 sscanf() 之后调用 free() 时检测到堆损坏
- 为什么在静态强制转换之后调用构造函数