我应该在所有内容上使用智能指针而忘记经典的普通指针吗?

MrH*_*ies 6 c++ boost smart-pointers shared-ptr

我一直在使用C++并且非常了解分配和释放内存时的谨慎,特别是不要忘记删除未使用的实例.

现在,我刚刚使用了boost并遇到了一个我面临的问题,我被迫使用智能指针(特别是shared_ptr).所以,如果我要使用shared_ptr来解决这个问题,我应该使用智能指针来解决所有正常的指针代码库吗?

Căt*_*tiș 18

你应该小心使用智能指针.在考虑内存管理时,它们不是银弹.循环引用仍然是一个问题.

在进行类设计时,始终要考虑谁拥有对象的所有权(有责任销毁该对象).如有必要,使用智能指针补充,但不要忘记所有权.

  • +1:这可能是关于使用我听过的智能指针的最明智的建议.此外,你不应该因为智能指针可用而被诱惑到"新".尽可能使用堆栈分配的对象,并使用智能指针来管理其余对象. (6认同)

Omn*_*ous 5

是的,你应该更喜欢智能指针而不是几乎所有的裸指针.但这并不意味着你应该在::boost::shared_ptr大多数情况下使用它们.事实上,我认为你应该shared_ptr谨慎使用.

但对于你不使用的那些指针你shared_ptr应该使用::std::auto_ptr或者,如果你有C++ 0x ::std::unique_ptr.如果它们不合适,你应该找到一个智能指针类型.

现在这并不总是正确的答案,几乎总是如此.智能指针对于跟踪和适当释放内存资源非常有用,即使面对异常或其他此类奇怪的控制流也是如此.

在某些情况下,您需要编写自己的智能指针类或不使用它.这些案件非常罕见,但它们存在.

例如,在您自己的智能指针类中使用智能指针可能不是正确的做法.指向在C库中分配的东西可能需要一个调用free而不是删除的自定义智能指针.也许你想要一个可以调用的弹性缓冲区realloc,并且::std::vector由于某种原因不想使用它.

但一般来说,智能指针(虽然通常不是::boost::shared_ptr(或在C++ 0x中::std::shared_ptr))是您的资源管理问题的正确答案.

  • 你应该使用**自动**(stack-allocated0变量用于几乎所有的东西.其余的,有智能指针和引用.然后,还有一堆其他用于裸指针. (3认同)

whe*_*ies 1

是的。如果您有可用的 Boost 智能指针,您应该在大多数情况下使用它们。请记住这一点,虽然您可以并且从您的评论中确实有效地使用了指针,但在您之后的人可能不会。使用智能指针可以并且将会(希望不能防止不良代码)缓解其中一些问题。

即使您的类设计得很好,我也建议在您的类中使用scoped_ptr 。它将有助于防止下一个人在面对裸指针时可能/可能/最有可能引入的问题。通过举例,它也会鼓励他们使用它们。您最不想看到的就是必须追踪内存问题,因为有人忘记将指针初始化为 NULL 并且它通过了 if 语句检查。

  • 我建议仅在您特别需要时才使用shared_ptr,而且这种情况应该很少。但是,是的,肯定是某种形式的智能指针。 (2认同)