gpt4 book ai didi

c++ - 通过引用传递 shared_ptr

转载 作者:行者123 更新时间:2023-11-28 07:15:35 27 4
gpt4 key购买 nike

我有这段代码:

class A
{
public:
A()
{
std::cout << "ctor called\n";
}
~A()
{

std::cout << "dtor called\n";
}
};

int main()
{
std::thread thread1([]{
std::shared_ptr<A> ptr(new A);
std::thread thread2([](std::shared_ptr<A>& arg){
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
std::cout << "use_count: " << arg.use_count() << std::endl;
},ptr);
thread2.detach();
std::cout << "thread1 quitting\n";
});
thread1.detach();
while (1);
return 0;
}

得到这个结果:

ctor called
thread1 quitting
use_count: 1
dtor called

然而,我预料到会发生这种情况:

ctor called
thread1 quitting
dtor called
use_count: 0

因为我认为通过引用传递 shared_ptr 不会增加其引用计数,因此一旦 thread1 超出范围,托管对象就会被销毁。你能告诉我为什么我错了吗?谢谢。

最佳答案

你声明你的 lambda 接受一个 shared_ptr 引用,但是 std::thread 的构造函数默认复制所有参数。

如果您单步执行被调用的析构函数,您会看到它的使用次数在原始函数被销毁之前暂时为 2。

要将 shared_ptr 作为引用传递,您可以使用 std::ref:

std::thread thread2([]{/*...*/}, std::ref(ptr));

这将为您提供 ptr 超出范围的预期行为,这意味着无论如何访问它都会调用未定义的行为。

关于c++ - 通过引用传递 shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20277522/

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