我需要在这里使用 shared_ptr 因为我无法更改 API。
Foo1 *foo1 = new Foo1(...);
shared_ptr<Foo2> foo2(foo1);
这里的 shared_ptr 是否会处理释放 foo1 使用的内存?如果我理解正确,我不应该在 foo1 上调用 delete 对吗?
我需要在这里使用 shared_ptr 因为我无法更改 API。
Foo1 *foo1 = new Foo1(...);
shared_ptr<Foo2> foo2(foo1);
这里的 shared_ptr 是否会处理释放 foo1 使用的内存?如果我理解正确,我不应该在 foo1 上调用 delete 对吗?
是的。你是对的,但正确的初始化方法foo2
是:
std::shared_ptr<Foo2> foo2 = std::make_shared<Foo1>();
std::make_shared<>()
Herb Sutter 讨论了您应该在此处
使用的原因: https ://herbsutter.com/2013/05/29/gotw-89-solution-smart-pointers/
您不应该在 foo1 上调用 delete。
最好不要创建 foo1。只有 foo2:
shared_ptr<Foo2> foo2(new Foo1(...));
std::shared_ptr 是一个智能指针,它通过指针保留对象的共享所有权。
如果您不需要共享此指针 - 考虑使用std::unique_ptr
std::unique_ptr 是一个智能指针,它: 通过指针保留对象的唯一所有权,并在 unique_ptr 超出范围时销毁指向的对象。
正确的。智能指针提供所有权语义。特别是,提供的语义使得std::shared_ptr
一旦最后一个shared_ptr
指向它的对象被销毁,该对象将被删除。shared_ptr
保持一个引用计数(有多少个shared_ptr
s 正在引用该对象),当它达到 0 时,它会删除该对象。