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

Does erasing a shared_ptr from a set deletes the managed object

本文关键字:删除 对象 是否 ptr 集合 擦除 shared      更新时间:2023-10-16

在下面的代码中,我希望指针tr所指向的内存被销毁。然而,根据gdb的说法,即使我验证了sp1,它指向与tr相同的地址,并且清除该集会导致trial对象sp被销毁,tr仍然指向相同的地址并且它显示的trial对象在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显示的地址的内容不应该被擦除吗?一旦指向指针tr地址的管理器对象的最后一个shared_ptr在从集合中擦除时被破坏?

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

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

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