一旦你';我们采用了boost';s智能指针,是否有使用原始指针的情况? 当我开始采用更多的助推成语时,我很好奇,我觉得奇怪的是,我的C++在什么地方看起来像过去的C++,经常出现在典型的例子中,在那些没有被引入“现代C++”的人的头脑中。?

一旦你';我们采用了boost';s智能指针,是否有使用原始指针的情况? 当我开始采用更多的助推成语时,我很好奇,我觉得奇怪的是,我的C++在什么地方看起来像过去的C++,经常出现在典型的例子中,在那些没有被引入“现代C++”的人的头脑中。?,c++,boost,smart-pointers,C++,Boost,Smart Pointers,这些天我几乎放弃了所有原始指针的使用。我甚至开始在代码库中查找使用原始指针的地方,并将它们切换到智能指针变体。通过这个简单的动作,我能删除多少代码,这真是太神奇了。在原始C++指针的生命周期管理中浪费了太多代码。p> 我唯一不使用指针的地方是针对几个互操作场景,以及我无法控制的其他代码库 我仍然在资源敏感代码中使用常规指针,或者在其他需要占用空间很小的代码中使用常规指针,例如某些异常,在这些异常中,我不能假设任何数据都是有效的,也必须假设我的内存不足 除此之外,托管内存几乎总是优于原始内存,因为

这些天我几乎放弃了所有原始指针的使用。我甚至开始在代码库中查找使用原始指针的地方,并将它们切换到智能指针变体。通过这个简单的动作,我能删除多少代码,这真是太神奇了。在原始C++指针的生命周期管理中浪费了太多代码。p>
我唯一不使用指针的地方是针对几个互操作场景,以及我无法控制的其他代码库

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

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

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

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

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

您可能认为这种情况并不经常发生,但假设您有一个父对象,它具有指向一组子对象的智能指针。在这个过程中,有些人需要在父对象中查找子对象,因此他们向子对象添加一个智能指针成员,该成员指向父对象。无声地,内存不再被释放


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

我几乎根本不使用
shared\u ptr
,因为我通常避免共享所有权。因此,我使用类似于
boost::scoped_ptr
的东西来“拥有”一个对象,但对它的所有其他引用都是原始指针。例如:

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

我仍然使用具有内存映射IO的设备的原始指针,例如嵌入式系统,其中智能指针没有真正意义,因为您将永远不需要或能够“代码>删除<代码> > .< /P> < P>我发现“现代”C++与旧**的主要区别是仔细使用类不变量和封装。组织良好的代码自然会减少指针的使用。我几乎和我在新闻和删除中一样紧张地在共享的图片中游泳

我期待着在C++0x中使用
unique\u ptr
。我认为这将清除仍然在野外漫游的少数(智能)指针


*不幸的是,仍然非常常见

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


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

< p>我编写的C++必须与目标C共存(使用ObjultC++来桥接)。 因为C++中的对象被声明为目标C++类的一部分,所以没有调用构造函数或析构函数,所以不能在智能指针中保存它们。


因此,我倾向于使用原始指针,尽管通常与boost::intrustive_ptr和内部ref count一起使用。

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

这两种方法会聪明得多,只需从我的头顶上取几个:

  • 在内存映射文件中导航
  • 必须过度分配的Windows API调用(如LPBitMapInfo标头)
  • 任意内存中的任意代码(VirtualQuery()等)
  • 在指针上使用reinterpret_cast的任何时候
  • 任何时候使用新的位置

这里的共同点是“在任何情况下,您需要将一段内存视为您拥有分配控制权的资源以外的其他东西。”

请告诉我——我想说的是,按照约定,通过原始指针传递可以暗示被调用方将不会保留对对象的引用(或至少不会影响资源管理)。如何以不影响资源管理的方式保留对该对象的引用?一旦资源被销毁,该引用的保留者现在必须知道这一事实,对吗?这都是关于作用域的。将所有者放在将要使用的对象的最外部作用域中,然后只在该作用域内传递指向该对象的指针。无引用nce允许存在于比所有者更广的范围内,因此它保证指向有效的对象。为什么不通过引用传递作用域的\u ptr?引用人!除非您想显式允许使用nullptr调用函数,否则我认为引用是一种方法。为什么在运行时发现错误,而编译器很乐意这样做呢t为您?这就是boost::weak_ptr的用途,如果您有它的话。因此您仍然可以使用智能指针而不是原始指针,只是不是所有的智能指针都将被共享。boost::weak_ptr绝对是解决循环引用问题的另一种方法,但我认为我的观点是
void some_function(SomeType* some_obj)
{
  assert (some_obj);
  some_obj->whatever();
}