在C++ 11后的现代C++中使用原始指针

Gum*_*jr. 12 c c++ pointers c++11

鉴于C++ 11标准现在得到了大多数体面编译器的良好支持,2014年使用原始指针的主要原因有哪些?

我确定了几个场景:

  1. 您正在扩展大量使用原始指针的遗留代码库,并且您希望保持样式的一致性.

  2. 您正在使用仅导出原始指针的库,但我猜您仍然可以使用强制转换.

  3. 您希望利用指针的功能来提供多个级别的间接.(我不太清楚C++ 11是否足以知道是否可以使用智能指针或使用其他技术来实现.)

您认为哪些其他场景适合使用指针?

你今天甚至会建议学习一般的指针吗?

Lig*_*ica 15

我可以想象你有一个静态分配数组的情况,并且你想使用原始指针在高性能代码中迭代它.这还没什么不对.

你的#1是真的.

你的#2可能不对:如果你是"利用强制转换"来将第三方库所拥有的原始指针转换为智能指针(暗示本地所有权),那么就会出现严重错误.

你的#3在技术上是正确的,但你可以随时避免这种情况.

什么是推荐现在是原始指针打自己的,动态分配的内存.也就是说,建议是避免new没有智能指针(并且推论是你不应该需要的delete).

  • +1,特别是最后一段. (3认同)

Cod*_*gry 13

每个人都反对原始指针,因为它太容易泄漏它们.

但是你可以使用原始指针指向其他地方拥有的数据......只是不要new/ delete他们.使用std::unique_ptrstd::shared_ptr为此.或者对于哑(POD)内存缓冲使用std::vector<unsigned char>,不要mallocfree你自己.

想想std::vector<heavy_object*>你何时需要与副本中的子选项进行兼顾,这些对象非常容易复制但已经存在于其他地方.你需要指针.

您还需要函数中的指针用于可选参数,其中引用不会将其剪切,因为您希望能够传递a nullptr.

连续对象的指针也可以轻松迭代,无需任何std::iterator开销.只是++--就是这样.对于向量begin,我经常使用直接指针迭代而不是end.

当你了解它们是如何工作的时候......你需要它们很多,你会正确地使用它们.

  • 你的个人偏好是一回事,但是当你自由承认你不知道这是否属实时,断言迭代器有一个开销......这是不负责任的. (4认同)

Jar*_*koL 7

智能指针用于处理对象所有权问题,但并非所有指针都用于处理对象所有权.例如,如果您不打算将所有权传递给此函数,则将原始指针传递给函数会更有意义(即您只是希望函数处理指针所寻址的数据)


Gal*_*lik 7

恕我直言,原始指针仍然占有一席之地。

C++11 给我们的是管理原始指针生命周期的能力,这样我们就不必自己删除它们。

使用原始指针没有任何问题,只要它们由正确范围或框架中的智能指针/指针管理器管理,以确保它们的寿命是正确的。如果这是真的,那么您永远不必删除原始指针,并且您可以在保证其生命周期的范围/框架内安全地使用它们。

我会说,如果可能的话,如果std::unique_ptr它的生命周期应该由给定的范围/框架控制,则将指向新对象的原始指针存储在 a 中。完成后,使用该范围框架内的原始指针。只是从来没有将其删除;

有时无法从单个范围或框架管理新对象的生命周期。在这种情况下,std::shared_ptr在需要独立管理新对象生命周期的每个范围/框架中使用 a 。然后,在每个范围/框架内,没有理由不使用原始指针,就像它由std::unique_ptr.

因此,通常没有理由招致智能指针的速度劣势,因为它们的优势之一在于管理新对象的生命周期,以确保原始指针的有效性及其对象的自动销毁。不再需要。

在其他时候,原始指针是不合适的。

例如,当托管指针需要将“所有权”转移到另一个范围/框架时。那就是当您需要负责管理新对象生命周期的范围/框架发生变化时。在这些情况下,避免像瘟疫这样的原始指针!