共享指针:为什么没有 double free?
Shared pointers: why no 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;
}
此代码是 UB,因此 任何事情 都可能发生。
对于 a
delete 在已删除的指针上调用。
Why does this code NOT generate a double free when the shared pointers
go out of scope?
为什么你认为没有?
这是未定义的行为,任何事情都有可能发生。这包括您的程序打印出 still ok
.
从原始指针构造多个共享指针会导致 undefined behavior,因为:
the pointed-to object will have multiple control blocks.
摘自 "Effective Modern 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);
为什么当共享指针超出范围时此代码不生成双重释放?
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;
}
此代码是 UB,因此 任何事情 都可能发生。
对于 a
delete 在已删除的指针上调用。
Why does this code NOT generate a double free when the shared pointers go out of scope?
为什么你认为没有?
这是未定义的行为,任何事情都有可能发生。这包括您的程序打印出 still ok
.
从原始指针构造多个共享指针会导致 undefined behavior,因为:
the pointed-to object will have multiple control blocks.
摘自 "Effective Modern 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);