从集合中删除 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();
在下面的代码中,我希望指针 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();