这可能是一个愚蠢的问题,但我无法回答。
使用下面的代码片段,输出是否有可能打印 “Shared Ptr out of range”
我正在尝试的是在创建共享副本之前原始 shard_ptr 超出范围。
我知道shared_ptr有一个原子ref_count。但是如果在创建shared_ptr的副本之前调用Test的复制构造函数,并且主线程中的shared_ptr sp超出范围会怎么样。
我尝试更改函数 foo 的参数顺序,它具有相同的结果,即如果块被执行。 共享 Ptr 的值为 9 被打印。
struct Test
{
Test() = default;
Test(const Test& t)
{
using namespace std::chrono_literals;
for (int i = 0; i < 5; ++i)
{
std::cerr << "I am sleeping----\n";
std::this_thread::sleep_for(2000ms);
}
}
};
void foo(std::shared_ptr<int> sp, Test t)
{
if (sp)
std::cerr << "Shared Ptr has value "<<*sp;
else
std::cerr << "Shared Ptr out of scope";
}
int main()
{
std::thread t;
{
Test tst;
auto sp = std::make_shared<int>(9);
t = std::move(std::thread(foo,sp, tst));
}
if(t.joinable())
t.join();
}
不,
sp
中的test
不可能为空。
std::thread(foo,sp, tst)
是一个同步点,
sp
将在代码继续前进之前被复制到线程中。 这意味着即使作用域退出,线程仍然有一个有效的副本保持指针处于活动状态。