用新内存覆盖“对象管理共享指针”C++

问题描述 投票:0回答:1

我有一个简单的代码,如下所示,我正在尝试 -

#include<iostream>
#include<memory>

class TestClass {
public:
  TestClass(int a, int b) : mA(a), mB(b) {
    std::cout << "constructor" << std::endl;
  }
  ~TestClass() { std::cout << "destructor" << std::endl; }
private:
  int mA;
  int mB;
};

int main(){

    auto classPtr = std::make_shared<TestClass>(100, 200);

    // Process....

    classPtr = std::make_shared<TestClass>(100, 200);

    return 0;
}

我覆盖了一个已经用新内存管理对象的共享指针。基于我对共享指针赋值运算符的阅读https://en.cppreference.com/w/cpp/memory/shared_ptr/operator%3D#:~:text=If,the%20owned%20deleter.,上一个在新的分配发生之前内存就被销毁了。

所以我预计输出是 -

constructor
destructor
constructor
destructor

但是输出是-

constructor
constructor
destructor
destructor

代码可在此处重现 - https://godbolt.org/

问题 - 我很好奇旧内存发生了什么以及为什么在第二次分配之前没有取消分配它。

c++ shared-ptr smart-pointers
1个回答
0
投票

第一个

constructor
是第一个对象的构造。

第二个

constructor
是第二个对象的构造。

第一个

destructor
是第一个对象的销毁,作为智能指针对象赋值的一部分。

第二个

destructor
是当变量超出范围时第二个对象的销毁。

必须先构造第二个对象,然后才能进行赋值。


你的代码基本上相当于:

// Construction of first object
auto classPtr = std::make_shared<TestClass>(100, 200);

// Construction of the second object
auto temporary = std::make_shared<TestClass>(100, 200);

// Assignment, causing destruction of the first object
classPtr = temporary;
© www.soinside.com 2019 - 2024. All rights reserved.