6

我需要在这里使用 shared_ptr 因为我无法更改 API。

Foo1 *foo1 = new Foo1(...);
shared_ptr<Foo2> foo2(foo1);

这里的 shared_ptr 是否会处理释放 foo1 使用的内存?如果我理解正确,我不应该在 foo1 上调用 delete 对吗?

4

3 回答 3

13

是的。你是对的,但正确的初始化方法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/

于 2012-10-03T16:45:16.123 回答
4

您不应该在 foo1 上调用 delete。

最好不要创建 foo1。只有 foo2:

shared_ptr<Foo2> foo2(new Foo1(...));

std::shared_ptr 是一个智能指针,它通过指针保留对象的共享所有权。

如果您不需要共享此指针 - 考虑使用std::unique_ptr

std::unique_ptr 是一个智能指针,它: 通过指针保留对象的唯一所有权,并在 unique_ptr 超出范围时销毁指向的对象。

于 2012-10-03T16:44:24.177 回答
1

正确的。智能指针提供所有权语义。特别是,提供的语义使得std::shared_ptr一旦最后一个shared_ptr指向它的对象被销毁,该对象将被删除。shared_ptr保持一个引用计数(有多少个shared_ptrs 正在引用该对象),当它达到 0 时,它会删除该对象。

于 2012-10-03T16:45:51.103 回答