gpt4 book ai didi

c++ - smart_ptr 到类段错误的属性

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:22 26 4
gpt4 key购买 nike

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

它会输出:

CTOR!
References Count:1
References Count:2
DTOR!
References Count:1
foo

Online Demo

关于c++ - smart_ptr 到类段错误的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37436009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com