【发布时间】:2015-06-21 13:35:04
【问题描述】:
在下面的代码中,我希望指针tr 指向的内存被销毁。然而,即使我验证了sp1,指向与tr 相同的地址,并且清除集合会导致trial 对象sp 一直被销毁,tr 仍然指向相同的地址和@987654327根据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 的地址,在从集合中删除时被破坏?
【问题讨论】:
-
我不明白到底是什么问题?好像没问题。
-
如何确定“对象没有被破坏”?析构函数运行后,检查该内存地址中剩余内容的内容本质上是没有意义的 - 对象已死。
-
因为在调试器中,我可以看到它显示了相同的地址,并且该地址仍然有相同的试验对象,其中a的值为5。
-
tr现在是一个悬空指针 - 一旦您将控制权传递给shared_ptr,依靠保持有效的原始原始指针是有风险的,因为shared_ptr现在负责它的寿命。简而言之,一旦shared_ptr被销毁,取消引用tr是未定义的行为。 -
未定义,这意味着 C++ 标准没有定义访问未分配内存时会发生什么。任何事情都可能发生,包括它仍然看起来像一个有效的对象。
标签: c++ shared-ptr move-semantics