我可以在任何我想使用简单指针的地方使用shared_ptr吗
Can I use a shared_ptr everywhere I want to use a simple pointer?
我对指针相当缺乏经验,而且我在处理简单指针和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
是个好主意还是坏主意 - 我使用的外部库有问题吗
- 我只是不理解指针和共享指针吗
当您为对象构造shared_ptr
(从现有shared_ptr
或weak_ptr
以外的任何对象)时,您正在创建一个新方案来管理对象的寿命。如果其他东西已经控制了该对象的寿命,那么这是一件完全失败的事情。例如,如果ReturnPointerToObject
返回指向其他对象的指针,则您无权控制该对象的生命周期,因此为其创建shared_ptr
是一种失败的行为,将导致delete
被错误调用。
我还建议不要在实际上不需要共享指针的情况下使用shared_ptr
。C++的方式是,你不为你不使用的东西付费,而其他机制(如unique_ptr
)也适用于不需要共享的情况。当然,你采取尽可能避免裸指针的政策是正确的。
相关文章:
- 如何使用从处理程序调度的最终回调将响应异步返回给调用方on_read?
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- 如何启用使用另一个类的静态方法的模板函数的自动推导,从而消除冗长的调用方代码
- 无法使用 libtool 将 -shared 参数传递给 g++
- 链接 boost 库时"Error while loading shared libraries"引发的,除了我无法使用 root 访问权限来修复它
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 在 Eclipse CDT 中使用 Visual Studio Toolchain 包含 3rd 方库
- 如何使用 python 从C++标头中检索类名及其方法名
- 通过 qt 对发送方和接收方使用自动生成的 Ui
- 使用 dbus-cpp 列出 WPA 请求方网络属性
- 为什么当数组作为调用方函数中的参数传递时,不能在被调用函数中使用 foreach 循环打印数组的值
- 当被调用方法使用调用方已锁定的同一锁时,如何避免死锁
- 如何在犰狳中使用变量/方差函数
- 有没有办法在 VisitCallExpr 方法中使用 clang 获取 CallExpr* 的调用方
- 继承-在两个不同的类中使用相同的方法名
- 练习:使用数组计算方差
- 使用 OpenCV 计算协方差矩阵
- 使用 select() 使用 UDP 套接字从多个对等方接收,同时从 STDIN 获取用户输入
- 如何使用 std::auto_ptr 实现协方差赋值
- 函数的调用方如何知道是否使用了返回值优化