C++ 基本构造函数/vector 问题(1 个构造函数,2 个析构函数)

标签 c++

问题可能很基本,但无法找出问题所在(这会导致我的应用程序出现大量内存泄漏):

class MyClass {
public:
    MyClass() { cout << "constructor();\n"; };
    MyClass operator= (const MyClass& b){ 
        cout << "operator=;\n"; return MyClass(); 
    };
    ~MyClass() { cout << "destructor();\n"; };
};

main() {
    cout << "1\n";
    vector<MyClass> a;
    cout << "2\n";
    MyClass b;
    cout << "3\n";
    a.push_back(b);
    cout << "4\n";
}

输出是:

1
2
constructor();
3
4
destructor();
destructor();
  1. 为什么有 2 个析构函数?
  2. 如果是因为创建了一个拷贝以插入 vector - 为什么从未调用“operator=”?

最佳答案

当 b 对象被插入 vector 时,会创建一个拷贝,但不是通过您拥有的 operator=() - 使用编译器生成的复制构造函数。

当 main() 超出范围时,b 对象被销毁,vector 中的拷贝也被销毁。

添加显式复制构造函数可以看到:

MyClass( MyClass const& other) {
    cout << "copy ctor\n";
};

关于C++ 基本构造函数/vector 问题(1 个构造函数,2 个析构函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/992435/

相关文章:

c++ - 什么是 MPL 值习语?

c++ - 从 C 到 C++ 的转换避免 <strsafe.h>

c++ - 线程未能影响性能

c++ - boost::variant 和函数重载决议

c++ - 派生类未被识别为协变

c++ - Mac 中的 GCC 与 Linux 中的 GCC

c++ - 为什么 struct{u64} 比 struct{u32,u32} 更快?

c++ - 可变参数模板函数中对重载函数的不明确调用

c++ - Windows服务创建文件的默认目录在哪里?

c++ - 将 ant 命令行选项传递给 exec'd ant 进程?