只是想澄清有关shared_ptr

int main(){
   typedef std::tr1::shared_ptr<Foo> _foo;

   _foo obja(new Foo());
   Foo *objb = obja.get();

   // delete objb; //deleting objb will throw double free or corruption
   return 0;
}


在上面的代码中,如果未删除或释放objb,是否存在内存泄漏?最后,obja将超出范围并释放自身。由于objb和obja指向同一个实例,这是否意味着不需要释放objb?

上面是否与此相同:

Foo *obja = new Foo();
Foo *objb;

objb = obja;
delete obja;

最佳答案

在上面的代码中,如果未删除或释放objb,是否存在内存泄漏?


否。Foo对象由obja共享指针拥有。通过执行.get(),您将检索“哑”,观察指针,该指针对指向对象的生存期没有任何影响。您只需要注意不要在指向的对象不再存在之后取消对它的引用,否则您将获得未定义的行为。


  由于objb和obja指向同一个实例,这是否意味着不需要释放objb?


不需要刷新objb,因为当obja超出范围时,其析构函数将delete拥有的对象。如果您执行delete objb,则尝试两次删除一个对象将获得未定义行为。


  上面是否与此相同:


我想有人可以这样说,是的。

关于c++ - 关于shared_ptr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15249855/

10-12 23:56