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

时间:2014-10-02 22:50:41

标签: c++ pointers c++11 shared-ptr

我对指针缺乏经验,而我在简单指针与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(...));    

当程序结束时取消分配内容时,我的程序崩溃了。

问题:

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

1 个答案:

答案 0 :(得分:5)

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

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