在下面的代码中,我期望指针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
显示的地址内容是否应该被删除从集合中删除?
答案 0 :(得分:0)
对象被销毁后,tr
成为悬空指针或释放内存的指针。为什么tr
中的值会改变,如果它只是一个单独的变量,恰好将地址保存到内存中的某个点?
答案 1 :(得分:0)
如果您尝试遵循调试代码,shared_ptr
sp1在std::vector::clear()
调用后引用计数为零就很明显了。
trialVector.clear();
std::cout<<sp1.use_count();