c++ - 构造函数中的额外析构函数、复制构造函数、C++ 中的析构函数序列

标签 c++ constructor destructor copy-constructor

我正在学习 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/

相关文章:

c++ - C++在控制台上输入 key ,空行未注册

c++ - 提供良好的散列函数

c++ - 如何让编译器知道调用哪个函数重载以避免歧义?

c++ - 当一个类的所有实例都被销毁时释放内存

c++ - 为什么在全局变量的析构函数中调用 thread.join 会失败

c++ - 混合 C 和 C++ 代码的静态分析怪异符号行为

c++ - 如何连接 wxWidgets、GTK2 小部件和 X11 窗口?

java - 如何使用 Guice 注入(inject)器创建对象?

c++ - 有条件地禁用复制构造函数

c++ - 条件运算符的局限性? :