c++ - 在现代 C++ 中使用非智能指针

标签 c++ pointers c++11 refactoring

简短版本:
在现代 C++ 中使用非智能指针有什么可以接受的理由吗?

长版:
我们有一个包含大量旧 C++ 代码的庞大产品,现在我们正试图将其重构为现代 C++ 时代。除了所有老式代码外,还有大量指针在传递(大多数带有 SAL 注释以提供某种安全感),我想知道我们是否应该将它们全部更改为智能指针,或者保留其中一些?
在尝试转换其中一些代码时,我最终得到了一个可以过度使用智能指针 的代码。

所以问题是:是否存在过度使用智能指针这样的事情?
或者换句话说:现在是否有非智能指针可以接受的场景?

最佳答案

智能指针(unique_ptrshared_ptr)应该是 OWNING 指针(即负责对象的销毁)。使用它们的底线是,任何由 new 创建的对象都应该尽快放入 unique_ptr 中,以防止内存泄漏。之后,unique_ptr 应该最终被移动:

  • 如果所有权应该共享,则进入 shared_ptr
  • 或放入 unique_ptr,如果所有权由范围( block 的范围或对象的生命周期)确定。

release 应该很少见。如果您的代码传递非拥有指针,这些应该是:

  • 原始指针,如果它们可能是 null,(通过 get 获得)
  • 引用,如果它们可能不是null,(通过get获得)
  • unique_ptr 如果调用的目的是转移所有权,则按值。 (在这种情况下,您需要移动它们)

工厂方法应该按值返回 unique_ptr。 (因为那样的话,如果你不给工厂方法的返回值赋值,对象会立即被释放)

并查看 Ali 关于处理遗留代码的一些哲学观点的链接的回答。 (我完全同意)

关于c++ - 在现代 C++ 中使用非智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19417574/

相关文章:

c - 运行函数的指针,其中变量是结构的变量

python - 调用函数时如何在 ctyps 中返回数组

C语言: Convert Pointer to String,我要返回什么?

c++ - 加载所有 DLL 函数

C++ 子类不能访问其他子类 vector

c++11:它的gc接口(interface)是什么,如何实现?

c++ - 未调用 move 赋值运算符

c++ - 在容器中使用智能指针的原因

c++ - 内部/嵌套类-私有(private)和公共(public)之间的区别

c++ - 关于何时调用嵌入对象的复制构造函数的困惑