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

C++ C++;基本构造函数/向量问题(1个构造函数,2个析构函数),c++,C++,这个问题可能很基本,但无法找出问题所在(这导致我的应用程序中出现大量memleaks): 为什么有两个析构函数 如果是因为创建了一个要插入向量的副本,那么为什么永远不会调用“operator= 当b对象被推送到向量上时,会生成一个副本,但不是由您拥有的操作符=()生成的,而是使用编译器生成的副本构造函数 当main()超出范围时,b对象被销毁,向量中的副本也被销毁 添加显式复制构造函数以查看以下内容: MyClass( MyClass const& other) { cout &

这个问题可能很基本,但无法找出问题所在(这导致我的应用程序中出现大量memleaks):

  • 为什么有两个析构函数
  • 如果是因为创建了一个要插入向量的副本,那么为什么永远不会调用“operator=

  • 当b对象被推送到向量上时,会生成一个副本,但不是由您拥有的
    操作符=()
    生成的,而是使用编译器生成的副本构造函数

    当main()超出范围时,
    b
    对象被销毁,向量中的副本也被销毁

    添加显式复制构造函数以查看以下内容:

    MyClass( MyClass const& other) {
        cout << "copy ctor\n";
    };
    
    MyClass(MyClass常量和其他){
    
    cout如果要记录所有副本和构造,则应添加显式副本构造函数,以便编译器不会为您创建副本构造函数

    MyClass( const MyClass& )
    {
        cout << "Copy constructor\n";
    }
    
    MyClass(const MyClass&)
    {
    
    有没有办法让“复制”机制使用my operator=或者(更好的)至少调用构造函数?你可以编写自己的复制构造函数,镜像operator=所做的事情。它调用复制构造函数,只需实现它,你就会看到。当向量为“vector”时,我会得到答案。但我看到了相同的行为(1个ctor和2个dtor)当我有一个“vector”时。为什么?即使我有一个sharedptrs的向量,MyClass的副本也会被创建吗?sharedptrt是ref counted smart ptr。@Gautam-你需要给我展示一些代码来智能地讨论可能发生的事情。听起来你可能有一个局部/自动变量(如问题中的
    b
    ),并将一个
    共享的\u ptr
    推送到向量上。在这种情况下,您有一个bug,两个实体认为他们拥有该对象并负责销毁它。一个是拥有本地/自动变量的“范围”,另一个是
    共享的\u ptr
    。您不能将本地/自动的所有权传递给
    共享的\u ptr(不完全正确,请参见下一条注释)。+1此外,您应该提到,应在operator=方法的开头进行自赋值检查。此赋值运算符对于自赋值是安全的,因此无需执行它。许多赋值运算符对于自赋值是安全的(例如,使用复制和交换实现的运算符),那些需要它的通常不是异常安全的(请参阅Herb Stutter优秀的异常C++)。出于这些原因,我宁愿只在必要时添加检查。好的,我说你应该这样做,因为这是一个很好的实践(即方法的未来修改)。仅此而已。可能,但更好的实践(IMHO)在将来的修改中,要保持赋值操作符固有的异常安全性和自分配安全性。我想需要添加一个明确的检查,这是一种折衷。“Nick:复制/交换习惯用语不需要对自我进行测试,而自我测试现在被认为是不好的实践,因为它的存在表明你是不存在的。t使用复制/交换。复制和交换是首选技术,因为它提供了“强大的异常保证”。注意。我使用复制和交换,并对self进行测试(但不是因为分配给self不好。而是因为它是一种优化技术。尽管如此,说它不是必需的)。
    
    MyClass( MyClass const& other) {
        cout << "copy ctor\n";
    };
    
    MyClass( const MyClass& )
    {
        cout << "Copy constructor\n";
    }
    
    MyClass& operator=( const MyClass& )
    {
        cout << "operator=\n";
        return *this;
    }