共享指针:为什么没有双免费?

时间:2018-01-27 18:03:51

标签: c++ shared-ptr double-free

为什么当共享指针超出范围时,此代码不会生成双重释放?

int main()
{
    {
        auto * ptr = new int(1);
        shared_ptr<int> a( ptr );
        shared_ptr<int> b( ptr );
        cout << "ok: " << *a << *b << endl;
    }
    cout << "still ok" << endl;
    return 0;
}

3 个答案:

答案 0 :(得分:6)

此代码为UB,因此可能会发生任何

对于已删除的指针调用a delete

答案 1 :(得分:6)

  

为什么此代码在共享指针时不会生成双重释放   超出范围?

为什么你认为它没有?

这是未定义的行为,任何事情都可能发生。这包括您的程序打印still ok

答案 2 :(得分:4)

从原始指针构造多个共享指针会产生undefined behavior,因为:

  

指向对象将有多个控制块。

摘自&#34;有效的现代C ++&#34;,第129页,第19项

避免将原始指针传递给std::shared_ptr构造函数。如果你真的必须使用原始指针,那么使用运算符new的结果而不是指针:

std::shared_ptr<int> a(new int(1));

或使用std::make_shared宏:

std::shared_ptr<int> a = std::make_shared<int>(1);

并通过将a作为参数传递给构造函数来创建第二个共享指针:

std::shared_ptr<int> b(a);