我想知道这个例子是否会导致段错误,因为对象的 dtor 被称为我仍然持有一个 shared_ptr 到对象的属性。
struct foo{
std::shared_ptr<std::string> const bar = std::make_shared<std::string>("foo");
foo() {std::cout << "CTOR!" << std::endl;}
~foo(){std::cout << "DTOR!" << std::endl;}
};
int main() {
std::shared_ptr<std::string> ptr;
{
std::shared_ptr<foo> foo_ptr = std::make_shared<foo>();
ptr = foo_ptr->bar;
}
std::cout << *ptr << std::endl;
return 0;
}
最佳答案
不,它不会。通过将 std::shared_ptr
分配给另一个,您拒绝它死亡。
此操作 ptr = foo_ptr->bar;
会将共享指针的计数器加一。这将保证空闲存储上动态分配的对象仍然存在。
即使对于销毁对象的属性也是如此吗?!
是的,这是真的。在非正式谈话中,动态分配内存的用途之一是当您希望对象比其所有者(另一个对象,指针......)存活得更多时。因此,在容器对象死亡后该对象仍然存在是完全没问题的。
尝试执行此代码。它会让你一目了然:
std::shared_ptr<std::string> ptr;
{
std::shared_ptr<foo> foo_ptr = std::make_shared<foo>();
std::cout <<"References Count:" << foo_ptr->bar.use_count()<<"\n";
ptr = foo_ptr->bar;
std::cout <<"References Count:" << foo_ptr->bar.use_count()<<"\n";
}
std::cout <<"References Count:" << ptr.use_count()<<"\n";
std::cout << *ptr << std::endl;
它会输出:
Online Demo
关于c++ - smart_ptr 到类 segfault 的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37436009/