使用智能指针作为编程标准?

Bun*_*ori 14 c++ pointers smart-pointers visual-c++

我听说越来越多,我应该使用智能指针而不是裸指针,尽管我已经实现了有效的内存泄漏系统.

请问使用智能指针的正确编程方法是什么?它们是否真的应用,即使我检查分配的内存块上的内存泄漏?还是由我决定吗?如果我不使用它们,这可以被视为编程弱点吗?

如果强烈建议使用智能指针(例如:std :: auto_ptr),我应该使用它们而不是每个裸指针吗?

jal*_*alf 22

您应该使用RAII来处理所有资源分配.

智能指针只是该规则的一个常见特例.

智能指针不仅仅是shared_ptr.有不同的智能指针具有不同的所有权语义.使用适合您需求的那个.(主要的有scoped_ptr,shared_ptr,weak_ptrauto_ptr/ unique_ptr(倾向于后者如果可用).根据你的编译器,他们可能会在标准库可用,或根本没有,在这种情况下,你可以让他们通过TR1的一部分提升图书馆.

是的,你应该绝对使用这些.它没有任何成本(如果正确完成,你会失去零性能),它会带来很多(内存和其他资源会自动释放,你不必记得手动处理它,你的代码使用资源获得更短更简洁)

请注意,并非每个指针用法都代表某种资源所有权,因此并非所有原始指针使用都是错误的.如果您只需要指向其他人拥有的对象,则原始指针非常适合.但是如果拥有该对象,那么您应该对它进行适当的所有权,或者通过给出类本身的RAII语义,或者将它包装在智能指针中.


Jer*_*fin 10

你不能盲目地替换std::auto_ptr每个原始指针.特别是,auto_ptr在转让时转让所有权,这对某些目的很有用,但绝对不适合其他目的.

有一个真正的原因有几种智能指针(例如,shared_ptr,weak_ptr,auto_ptr/unique_ptr等)每个都实现了不同的目的."原始"指针的一个主要缺点是它具有如此多的不同用途(并且具有这种多功能性,主要是因为它在任何一个目的上很少或没有任何帮助).智能指针往往更专业,这意味着他们可以更聪明地做好一件事,但也意味着你必须选择合适的工作,否则它将完全归咎于错误的事情.