从集合中擦除shared_ptr是否会删除托管对象
Does erasing a shared_ptr from a set deletes the managed object
在下面的代码中,我希望指针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();
相关文章:
- 迭代时从向量和内存中删除对象
- C++从对象自己的类中删除对象
- 如何通过对象的类属性删除对象,并返回其对象值?
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 从列表C++中删除对象
- c++ 循环访问对象列表并删除对象
- 从对象本身的容器中删除对象
- 从尝试引用已删除函数的矢量 C++ 中删除对象
- 如何通过指向元组的共享指针删除对象
- 防止通过接口删除对象
- 在 c++ 中从内存中删除对象
- 当对象被删除时,复制被删除对象的对象如何
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 从内存中删除对象
- 通过C++中的删除方法自行删除对象
- C++ - 析构函数只是释放内存还是实际删除对象
- 如何通过存储在 std::list 中的指针删除对象?
- 如何通过对象参数从指针矢量中删除对象和指针
- 我可以删除对象的右值版本的函数吗?
- 使用对象的索引从矢量中删除对象