我越来越多地听说,我应该使用智能指针,而不是裸指针,尽管我已经实现了有效的内存泄漏系统。
请问关于使用智能指针的正确的编程方法是什么?即使我检查分配的内存块上的内存泄漏,也应该使用它们吗?还是我说了算吗?如果我不使用它们,这能被认为是编程上的弱点吗?
如果强烈建议使用智能指针(例如: std::auto_ptr),是否应该使用它们而不是每个裸指针
发布于 2011-05-26 16:49:54
您应该使用RAII来处理所有资源分配。
智能指针只是该规则的一个常见特例。
智能指针不仅仅是shared_ptr
。有不同的智能指针具有不同的所有权语义。用一个适合你需要的。(主要是scoped_ptr
、shared_ptr
、weak_ptr
和auto_ptr
/unique_ptr
(在可用的情况下更喜欢后者)。根据编译器的不同,它们可能作为TR1的一部分在标准库中可用,或者根本没有,在这种情况下,您可以通过Boost库获得它们。
是的,你绝对应该使用这些。它不需要花费任何费用(如果正确的话,您将失去零性能),并且它会给您带来很多好处(内存和其他资源会自动释放,您不需要记住手动处理它,并且使用该资源的代码变得更短、更简洁)。
注意,并非每个指针使用都代表某种类型的资源所有权,因此并非所有原始指针使用都是错误的。如果您只需要指向其他人拥有的对象,则原始指针是非常合适的。但是,如果您拥有这个对象,那么您应该通过给类本身RAII语义,或者通过将它封装在一个智能指针中,来获得它的适当所有权。
发布于 2011-05-26 16:54:32
不能盲目地用std::auto_ptr
代替每个原始指针。特别是,auto_ptr
在转让时转移所有权,这对于某些目的是很好的,但对其他目的则肯定不是这样。
有一个真正的原因是有多种智能指针(例如,shared_ptr、weak_ptr、auto_ptr/unique_ptr等)。每个人都有不同的目的。“原始”指针的一个主要缺点是它有许多不同的用途(并且具有这种通用性,很大程度上是因为它对任何一个目的几乎没有什么帮助)。聪明的指针往往更专业,这意味着他们可以更聪明地做好一件事情,但也意味着你必须为这份工作选择正确的一件事,否则它最终会做错的事情。
发布于 2011-05-26 16:52:33
即使我检查分配的内存块上的内存泄漏,也应该使用吗?
,YES,
智能指针的全部目的是,它帮助您实现https://stackoverflow.com/questions/395123/raii-and-smart-pointers-in-c,它基本上让资源本身承担其解除分配的责任,并且资源不必依赖于您显式地记住来释放它。
如果我不使用它们,这能被认为是编程的弱点吗?
NO,
如果您不使用智能指针(RAII),那么单独显式地管理资源并不是一个弱点,而是一个不便或不必要的麻烦。实现RAII的智能指针的目的是提供高效和轻松的处理资源的方法,如果不使用它,您就不会使用它。强烈建议将其完全用于它提供的众多优势。
如果强烈建议使用智能指针(ex:std::auto_ptr),是否应该使用它们而不是每个裸指针?
,YES,
您应该尽可能地使用智能指针,因为使用它们没有缺点,而且使用它们有很多优点。
但是不要使用auto_ptr
,因为它已经被废弃了!!根据需求,您还可以使用其他各种智能指针。您可以参考上面的链接来了解更多关于它们的信息。
https://stackoverflow.com/questions/6142142
复制相似问题