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

Can I use a shared_ptr everywhere I want to use a simple pointer?

本文关键字:方使用 shared ptr 指针 任何我 简单 我可以      更新时间:2023-10-16

我对指针相当缺乏经验,而且我在处理简单指针和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. 我只是不理解指针和共享指针吗

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

我还建议不要在实际上不需要共享指针的情况下使用shared_ptr。C++的方式是,你不为你不使用的东西付费,而其他机制(如unique_ptr)也适用于不需要共享的情况。当然,你采取尽可能避免裸指针的政策是正确的。

相关文章: