我正在学习 C++,并且是 StackOverflow 的新手。对于测试代码,我观察到一个与我预期相关的额外析构函数调用。下面是代码,后面是我的预期输出,然后是实际输出。
代码:
#include <iostream>
class c_Test {
public:
c_Test() { std::cout << "Constructor" << std::endl; }
c_Test(const c_Test& x_in) { std::cout << "Copy constructor" << std::endl; }
c_Test operator= (const c_Test&) { std::cout << "operator =" << std::endl; }
~c_Test() { std::cout << "Destructor" << std::endl; }
};
int main()
{
c_Test t0, t1; // call constructor, constructor
c_Test t2 = t0; // call copy constructor
t0 = t1; // call operator=
return 0; // should call destructor, destructor, destructor
}
我预计输出是:
Constructor
Constructor
Copy constructor
operator =
Destructor
Destructor
Destructor
程序编译运行后的结果:
Constructor
Constructor
Copy constructor
operator =
Destructor
Destructor
Destructor
Destructor
我希望每个析构函数都与构造函数配对,但事实并非如此。为什么多了一个析构函数?
最佳答案
您的 operator=
声明了一个返回类型但不返回任何内容;这会导致未定义的行为。如果你把它改成
c_Test &operator= (const c_Test&) {
std::cout << "operator =" << std::endl;
return *this;
}
然后你会得到你期望的行为。
旁注:这超出了语言规范,因此不可靠,但有理由怀疑您的编译器插入了析构函数调用,因为 operator=
您declared 从外部看起来好像它返回了一个临时值(即,好像它已经构造了一个需要销毁的对象),并且没有插入相应的构造函数调用,因为 operator=
没有使兑现其声明的 promise 。
事实上,只需将 operator=
声明为返回引用而不插入 return
语句,即可使使用 gcc 4.9(未优化)编译的代码显示预期的效果行为。用 clang 编译它会崩溃,这是它的权利。
关于c++ - 构造函数中的额外析构函数、复制构造函数、C++ 中的析构函数序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29778392/