我可以在任何地方使用shared_ptr我想使用简单的指针吗?

jlc*_*lin 1 c++ pointers shared-ptr c++11

我对指针很缺乏经验,而且我遇到了简单指针与a之间差异的问题std::shared_ptr.我想使用一个,shared_ptr所以当没有任何指向时,我不必非常小心地删除该对象.

我正在使用我正在使用的库/标题(easylogging ++).我不认为它是外部库的问题,但我使用指针.该库有一个函数,它返回一个指向对象的简单指针.我总是把简单的指针转换成shared_ptr麻烦发生的地方.

// Works fine---but I want a shared_ptr
Object* MyInstance(ReturnPointerToObject(...));   
// Compiles fine, but crashes during deallocation of the Object (Seg fault?)
std::shared_ptr<Object> MyInstance(ReturnPointerToObject(...));    
Run Code Online (Sandbox Code Playgroud)

当程序结束时释放内容时,我的程序崩溃了.

问题:

  1. 将指针转换成shared_ptr这样的好主意还是坏主意?
  2. 这是我正在使用的外部库的问题吗?
  3. 我根本不理解指针和共享指针吗?

Dav*_*rtz 5

当您构造一个shared_ptr对象(从现有shared_ptrweak_ptr该对象以外的任何东西)时,您正在创建一个新方案来管理对象的生命周期.如果其他东西已经控制了该对象的生命周期,那么这是一件完全破碎的事情.例如,如果ReturnPointerToObject返回指向其他人对象的指针,则无权控制对象的生命周期,因此创建一个对象shared_ptr就是破坏行为并导致delete被错误地调用.

我也建议不要使用shared_ptr你实际上不需要共享指针的地方.C++方式是您不为不使用的内容付费,并且unique_ptr对于不需要共享的情况存在其他机制(例如).当然,你应该采取尽可能避免裸指针的政策.