一旦你采用了boost的智能指针,你有没有使用原始指针的情况?

时间:2008-12-12 16:47:15

标签: c++ boost smart-pointers

我很好奇,因为我开始采用更多的提升习语和看似最好的做法我想知道我的c ++甚至远远看起来像过去的c ++,经常在典型的例子和头脑中找到那些没有被介绍过“现代C ++”的人?

10 个答案:

答案 0 :(得分:7)

我几乎没有使用shared_ptr,因为我一般都避免共享所有权。因此,我使用boost::scoped_ptr之类的东西来“拥有”一个对象,但对它的所有其他引用都是原始指针。例如:

boost::scoped_ptr<SomeType> my_object(new SomeType);
some_function(my_object.get());

some_function将处理原始指针:

void some_function(SomeType* some_obj)
{
  assert (some_obj);
  some_obj->whatever();
}

答案 1 :(得分:6)

我的头脑中只有几个:

  • 在内存映射文件中导航。
  • Windows API调用必须过度分配的地方(如LPBITMAPINFOHEADER)。
  • 您在任意内存(VirtualQuery()等)中进行调整的任何代码。
  • 几乎任何时候你都在使用reinterpret_cast&lt;&gt;在指针上。
  • 任何时候使用placement-new。

这里的共同点是“你需要将一块内存视为除了你拥有分配控制权的资源之外的任何情况”。

答案 2 :(得分:4)

这些天我几乎放弃了所有原始指针的使用。我甚至开始在我们的代码库中查找使用原始指针的地方,并将它们切换为智能指针变体。通过这个简单的行为,我能够删除多少代码。在原始C ++指针的生命周期管理上浪费了太多代码。

我不使用指针的唯一地方是几个互操作场景以及我无法控制的其他代码库。

答案 3 :(得分:4)

我发现'现代'C ++与旧*之间的主要区别在于谨慎使用类不变量和封装。组织良好的代码自然会有更少的指针飞来飞去。我在shared_ptrs游泳时几乎和在新闻和删除中一样紧张。

我期待C ++ 0x中的unique_ptr。我认为这样可以整理那些仍在疯狂漫游的少数(聪明)指针。

*仍然不幸很常见

答案 4 :(得分:4)

当然,只要您处理遗留库或API,就需要传递原始指针,尽管您可能只是暂时从智能指针中提取它。

事实上,将原始指针传递给函数总是安全的,只要函数不尝试将指针的副本保存在全局或成员变量中,或者尝试删除它。有了这些限制,该函数不会影响对象的生命周期,智能指针的唯一原因是管理对象的生命周期。

答案 5 :(得分:2)

我仍然在资源敏感的代码或其他需要很小占用空间的代码中使用常规指针,例如某些异常,我不能假设任何数据都是有效的,并且还必须假设我的内存不足。

托管内存几乎总是优于原始内存,因为这意味着您不必在正确的位置处理删除它,但仍然可以很好地控制指针的构造和破坏点。

哦,还有另外一个地方可以使用原始指针:

boost::shared_ptr<int> ptr(new int);

答案 6 :(得分:2)

我仍然在具有内存映射IO的设备上使用原始指针,例如嵌入式系统,其中智能指针实际上没有意义,因为您永远不需要或能够delete它。

答案 7 :(得分:1)

如果你有循环数据结构,例如,A指向B和B指向A,则不能对A和B使用天真的智能指针,因为这样对象只会被释放额外的工作。要释放内存,你必须手动清除智能指针,这与删除智能指针一样糟糕。

你可能会经常发生这种事情,但假设你有一个Parent对象,它有一些智能指针指向一堆Child对象。在某个地方某人需要查找一个Child的子项,因此他们将一个智能指针成员添加到Child,指向父项。默默无闻,记忆不再被释放。

需要一些护理。智能指针不等同于垃圾收集。

答案 8 :(得分:1)

我正在编写必须与Objective C共存的C ++(使用Objective C ++来桥接)。 因为声明为Objective C ++类的一部分的C ++对象没有调用构造函数或析构函数,所以你无法在智能指针中实际存在它们。

所以我倾向于使用原始指针,尽管经常使用boost :: intrustive_ptr和内部引用计数。

答案 9 :(得分:0)

不是我会这样做,但你需要原始指针来实现,比如链接列表或图表。但使用std::list<>boost::graph<>

会更聪明