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