2

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

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;
}
4

3 回答 3

6

这段代码是 UB,所以任何事情都可能发生。

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

于 2018-01-27T18:05:03.833 回答
6

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

为什么你认为它没有?

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

于 2018-01-27T18:16:31.373 回答
4

从原始指针构造多个共享指针会导致未定义的行为,因为:

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

摘自“有效的现代 C++”,第 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);
于 2018-01-27T18:18:44.243 回答