从集合中删除 shared_ptr 是否会删除托管对象

Does erasing a shared_ptr from a set deletes the managed object

在下面的代码中,我希望指针 tr 指向的内存被销毁。然而,即使我验证了 sp1,指向与 tr 相同的地址,并且清除该集合导致 trial 对象 sp 继续被销毁,tr仍然指向相同的地址,并且它显示的 trial 对象没有被破坏,根据 gdb,在 return 0.

class trial
:public enable_shared_from_this<trial>
{
public:
    trial(int n)
    {
        cout<<"new trial created with number : " << n << endl;
        a = (int*)malloc(4);
        *a = n;
    }


    ~trial() {
        cout << "trial destroyed"<< endl;
    }

    int *a;
};

int main() {
    cout << "Program Started" << endl;

    trial *tr = new trial(5);
    shared_ptr<trial> sp1(tr);
    set<shared_ptr<trial>> trialVector;

    trialVector.insert(std::move(sp1));


    trialVector.clear();

    return 0;
}

当程序到达 return 0 行时,控制台显示:

Program Started
new trial created with number : 5
trial destroyed

承认,一旦 sp1 从集合中移除,tr 确实被破坏了。但是 tr 仍然具有相同的地址和相同的值。

这是怎么回事?

编辑: 为了清楚起见,我的问题是:

不应该删除指针tr显示的地址内容,一旦最后一个shared_ptr指向指向指针tr地址的管理器对象, 在从集合中删除时被破坏 ?

对象被销毁后tr变成悬垂指针或释放内存的指针。为什么 tr 中的值会发生变化,如果它只是一个单独的变量,恰好将地址保存到内存中的某个点?

如果您尝试使用调试代码,很明显 shared_ptr sp1 在 std::vector::clear() 调用后的引用计数为零。

trialVector.clear();
std::cout<<sp1.use_count();