理解c++中的智能指针增强
understanding the smart pointer boost in c++
我对c++和智能指针都是新手。我有一个这样的代码。
Example* Example::get_instance() {
Example* example = new Example();
return example;
}
我正在尝试将其转换为像这样的智能指针
shared_ptr<Example> Example::get_instance() {
shared_ptr<Example> example (new Example());
return example;
}
这是正确的方式,因为当我试图从另一个类调用它不工作。我正在尝试实现一个单例对象。
每次请求对象时都创建一个新的Example
对象,这是内存泄漏,并且每次也返回不同的对象。试试这个:
Example & Example::get_instance() {
static Example example;
return example;
}
还请注意以下对代码的建议:
创建智能指针时更喜欢
make_shared
而不是shared_ptr<YourType>(new YourType(...))
。原因可以在这里找到。相关摘录:该函数通常为T对象和Shared_ptr的控制块具有单个内存分配(它是一个标准中不具约束力的要求)。相反,宣言std::shared_ptr p(new T(Args…))至少执行两个内存分配,这可能会产生不必要的开销。此外,F (shared_ptr(new int(42)), g())可能导致内存泄漏抛出异常。这个问题不存在,如果make_shared是使用。
理解
std::unique_ptr
和std::shared_ptr
的区别。对于您的情况,std::unique_ptr
会更好,但是有一个更简单的解决方案来解决您的问题,我在上面展示了。一般来说,当你可以使用引用时避免使用指针,它们更容易使用,代码看起来更干净。
- 最后,你真的想要一个单例吗?我只是想问一下。作为一名全职程序员,我已经工作了近4年。我知道,时间不长,但足以让我遇到这样的情况:我后悔自己或其他人使用了Singleton模式,而不是在调用链中传递对我的对象的引用。
尽量避免单例,你可能会发现你的代码使用单例可能在最后想工作在多个实例的Example
对象,而不是调用Example::get_instance,只工作在单个实例。因此,当您了解到这一点时(这可能只是时间问题),您将面临重大的重构。
所以,"小心,有龙!"
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- 可以通过非原始指针来增强容器矢量管理内存
- PCL中的这些增强指针初始化是不同的
- OPENCV或增强智能指针
- 使用指针增强序列化
- 使用自定义删除器增强智能指针
- 在取消引用的基类指针上增强序列化
- 对原生c++指针(如uint16 *)的std::find()的替代或增强
- 处理可能的空指针的类的增强序列化
- 理解c++中的智能指针增强
- 增强封装指针的类的序列化