我想知道这个例子是否会导致段错误,因为对象的 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/

10-11 01:03