我对指针缺乏经验,而我在简单指针与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(...));
当程序结束时取消分配内容时,我的程序崩溃了。
问题:
shared_ptr
这个好主意还是坏主意? 答案 0 :(得分:5)
当你为一个对象构建一个shared_ptr
时(从现有的shared_ptr
或weak_ptr
到该对象以外的任何东西)你正在创建一个新的方案来管理对象&#39;寿命。如果其他东西已经控制了该对象的生命周期,那么这是一件完全破碎的事情。例如,如果ReturnPointerToObject
返回指向其他人对象的指针,则无权控制对象的生命周期,从而为其创建shared_ptr
是破坏的行为并将导致delete
被错误地调用。
我还建议不要使用shared_ptr
,而实际上并不需要共享指针。 C ++方式是您不会为不使用的内容付费,而且对于不需要共享的情况,存在其他机制(例如unique_ptr
)。当然,你应该采取尽可能避免赤裸裸指针的政策。