C++ 分配取消引用的共享\u ptr

C++ 分配取消引用的共享\u ptr,c++,memory-leaks,shared-ptr,dereference,C++,Memory Leaks,Shared Ptr,Dereference,考虑以下类别: struct MyClass { int mId; MyClass(int id): mId(id) {} ~MyClass() { std::cout << "deleting: " << mId << std::endl; } }; 请帮助我理解: 为什么有两个MyClass(2)对象(假设在析构函数日志上) 这是内存泄漏吗?MyClass(0)是否应该泄漏 谢谢。没有内存泄漏。此代码: m = MyClass(2)

考虑以下类别:

struct MyClass {
    int mId;
    MyClass(int id): mId(id) {}
   ~MyClass() { std::cout << "deleting: " << mId << std::endl; }
};
请帮助我理解:

  • 为什么有两个
    MyClass(2)
    对象(假设在析构函数日志上)
  • 这是内存泄漏吗?
    MyClass(0)
    是否应该泄漏
    谢谢。

    没有内存泄漏。此代码:

    m = MyClass(2);
    
    创建类型为
    MyClass
    的临时对象,该对象使用
    MyClass
    的复制赋值操作符(默认生成)复制到
    m
    ,然后销毁。最后,
    p
    超出范围,其析构函数将销毁is指向的
    MyClass
    实例(绑定到
    m

    如果我们明确说明所有隐式调用,就会发生这种情况:

    // std::shared_ptr<MyClass> p(new MyClass(0));
    tmp1.MyClass(0);
    p.shared_ptr(&tmp1);
    
    // MyClass& m = *p;
    p.operator* ();
    
    // m = MyClass(2);
    tmp2.MyClass(2);
    m.operator= (tmp2);
    tmp2.~MyClass();
    
    // p goes out of scope
    p.~shared_ptr();
    tmp1.~MyClass();
    
    //std::shared_ptr p(新的MyClass(0));
    tmp1.MyClass(0);
    p、 共享ptr(&tmp1);
    //MyClass&m=*p;
    p、 操作员*();
    //m=MyClass(2);
    tmp2.MyClass(2);
    m、 运算符=(tmp2);
    tmp2.~MyClass();
    //p超出范围
    p、 ~shared_ptr();
    tmp1.~MyClass();
    
    这样做可以更清楚地了解创建和销毁:

    struct MyClass {
        int mId;
        MyClass(int id): mId(id) {std::cout << "Creating: " << this << "(" << mId << ")\n";}
       ~MyClass()                {std::cout << "Deleting: " << this << "(" << mId << ")\n";}
        MyClass(MyClass const& c)
                                 {std::cout << "Copy:     " << this << "(" << mId << ")\n"
                                               "    From: " << &c   << "(" << c.mId << ")\n";
                                  mId=c.mId;
                                 }
        MyClass& operator=(MyClass const& c)
                                 {std::cout << "Assign:   " << this << "(" << mId << ")\n"
                                               "    From: " << &c   << "(" << c.mId << ")\n";
                                  mId=c.mId;
                                 }
    };
    

    非常感谢你的详尽回答,安杰!在“构造器/复制构造器/赋值/析构函数”中放上指纹,你就能更清楚地看到创建和销毁@你让我感到很尴尬:)
    // std::shared_ptr<MyClass> p(new MyClass(0));
    tmp1.MyClass(0);
    p.shared_ptr(&tmp1);
    
    // MyClass& m = *p;
    p.operator* ();
    
    // m = MyClass(2);
    tmp2.MyClass(2);
    m.operator= (tmp2);
    tmp2.~MyClass();
    
    // p goes out of scope
    p.~shared_ptr();
    tmp1.~MyClass();
    
    struct MyClass {
        int mId;
        MyClass(int id): mId(id) {std::cout << "Creating: " << this << "(" << mId << ")\n";}
       ~MyClass()                {std::cout << "Deleting: " << this << "(" << mId << ")\n";}
        MyClass(MyClass const& c)
                                 {std::cout << "Copy:     " << this << "(" << mId << ")\n"
                                               "    From: " << &c   << "(" << c.mId << ")\n";
                                  mId=c.mId;
                                 }
        MyClass& operator=(MyClass const& c)
                                 {std::cout << "Assign:   " << this << "(" << mId << ")\n"
                                               "    From: " << &c   << "(" << c.mId << ")\n";
                                  mId=c.mId;
                                 }
    };
    
    Creating: 0x7fc741c000e0(0)
    Creating: 0x7fff50ac38c0(2)
    Assign:   0x7fc741c000e0(0)
        From: 0x7fff50ac38c0(2)
    Deleting: 0x7fff50ac38c0(2)
    Deleting: 0x7fc741c000e0(2)