在创建shared_ptr的副本之前,原始的shared_ptr是否可能超出范围

问题描述 投票:0回答:1

这可能是一个愚蠢的问题,但我无法回答。 使用下面的代码片段,输出是否有可能打印 “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();
}
c++ multithreading c++11 shared-ptr smart-pointers
1个回答
0
投票

不,

sp
中的
test
不可能为空。

std::thread(foo,sp, tst)

是一个同步点,

sp
将在代码继续前进之前被复制到线程中。 这意味着即使作用域退出,线程仍然有一个有效的副本保持指针处于活动状态。

© www.soinside.com 2019 - 2024. All rights reserved.