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

时间:2015-06-21 13:35:05

标签: c++ shared-ptr move-semantics

在下面的代码中,我期望指针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显示的地址内容是否应该被删除从集合中删除?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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