c++ - 为什么我的析构函数被调用了两次?

标签 c++ destructor

假设我有一个 Student 类的方法:

Student Student::method(Student x)
{
    //nothing important
    return x;
}

复制构造函数被调用两次,一次是对象 x 作为参数发送时,第二次是从函数返回 x 时。

为什么当我调用此方法时,以及何时类 Student 的析构函数被调用了两次? 调用是这样的:a = b.method(c),其中 a、b 和 c 是 Student 对象。

最佳答案

对于您的示例,a = b.method(c);,除了复制省略之外,可能会发生三个拷贝。第一个是当 c 对象被复制到函数参数 x 时。第二个是当 x 对象从函数返回时。第三种是将返回值复制到a 对象中。前两个涉及拷贝构造函数,最后一个涉及拷贝赋值运算符,除非你把它改成Student a = b.method(c);,那样他们都使用拷贝构造函数。

abc 都将在其范围结束时被销毁。对象 x 将在 method 函数结束时被销毁。函数的返回值将在包含它的完整表达式的末尾销毁 - 也就是说,一旦 a = b.method(c); 完成。

但是,并非所有这些复制都必须发生 - 在某些情况下,允许编译器省略或忽略类的复制/移动构造。将首先复制到函数参数中。在尝试复制之前,函数的第二个拷贝将首先被视为移动。此拷贝或移动可能会被省略。从临时返回值到 a 的最终拷贝,如果您使用复制赋值,将会发生,但如果您使用复制构造函数(如 Student a = b.method 中),则可能会被省略(c);).

关于c++ - 为什么我的析构函数被调用了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14582022/

相关文章:

c++ - 如何获取指向 std::vector 的最后插入元素的指针?

c++ - 复制 std::string 时的 MSVC 12 std::initializer_list 错误

c++ - 为什么异常的析构函数被调用两次?

c++ - 您如何确保调用 Derived 析构函数?

c++ - C++ 中的 golang 样式 "defer"

c++ - 在 Visual Studio 10 中链接 MySQL 库

c++ - 使用迭代器的通用构造函数

python - 为什么 -1/2 在 C++ 中评估为 0,但在 Python 中评估为 -1?

C++:带有成员的抽象类中的纯虚拟析构函数

C++11构造函数和析构函数顺序