2008-12-12 35 views

回答

6

短短几关我的头顶:

  • 在内存映射文件浏览各地。
  • Windows API调用必须过度分配(如LPBITMAPINFOHEADER)。
  • 任何代码,你在任意内存(虚拟查询()等)周围。
  • 只是你正在使用的一个指针的reinterpret_cast <>的任何时间。
  • 任何时候您使用placement-new。

这里的常见问题是“任何情况下,您需要将一段内存视为除您拥有分配控制的资源之外的其他内容”。

4

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

我不使用指针的唯一地方是与其他代码库的几个互操作场景,我没有控制权。

2

我还是用在需要占用空间小,如某些例外情况,在那里我可以不承担任何数据是有效的,也必须承担,我运行内存过于资源敏感的代码或其他代码的常规指针。

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

哦,还有一个其他地方使用的原始指针:

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

我以为有没有开销与boost:指针类?编译器不会优化所有的东西吗? – ApplePieIsGood 2008-12-12 18:53:49

+0

有限范围的指针类没有大量开销,但它必须存在,并且共享指针需要引用计数和关联的机制。我总是遵循规则1;首先配置文件,然后优化。 – coppro 2008-12-12 19:17:36

+0

无法想象我需要在堆上明确分配单个int的15年C++编码的单个时间。 int:s的数组是另一回事,但总是有std :: vector 。 – 2008-12-21 00:27:33

1

如果您有圆形的数据结构,例如,A点到B点和B点回到A,则不能使用简单地使用A和B的智能指针,从那时起对象只会被释放额外的工作。为了释放内存,您必须手动清除智能指针,这与删除智能指针所消除的差不多。

你也许事情并不经常发生,但假设您具有智能指针一堆的子对象的父对象。在某个程序中,有人需要查找孩子的父母,因此他们将智能指针成员添加到孩子,并指向父母。无言以对,内存不再释放。

需要注意一些事情。智能指针不等于垃圾收集。

+1

这就是boost :: weak_ptr的用途,如果你有它的话。所以你仍然可以使用智能指针而不是原始的,只是不是所有的智能指针都是shared_ptr。 – 2008-12-12 18:13:12

+0

绝对boost :: weak_ptr是解决循环引用问题的另一种方法,但我认为我的观点仍然存在:您必须注意,不要盲目使用任何智能指针。 – 2008-12-12 18:49:27

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(); 
} 
2

我仍然使用原始指针上已存储器映射的IO设备,诸如嵌入式系统,其中,具有智能指针没有按”这真的很有意义,因为你永远不需要或能够达到这个目的。

4

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

我很期待在C++ 0x中的unique_ptr。我认为这将清理仍然漫游的少数(聪明)指针。

*仍然遗憾的是很常见的

4

当然,任何你正在处理遗留库,否则你会需要通过原始指针API,虽然你可能只是从你的智能指针提取它暂时的时间。

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

1

我正在写有C++共存目标C(使用Objective C++桥接)。 因为作为Objective C++类的一部分声明的C++对象没有调用的构造函数或析构函数,所以您不能在智能指针中使用它们。

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

0

不,我会做,但你需要实现,比方说,一个链接列表或图形原始指针。但是使用std::list<>boost::graph<>会更聪明。