MrH*_*ies 6 c++ boost smart-pointers shared-ptr
我一直在使用C++并且非常了解分配和释放内存时的谨慎,特别是不要忘记删除未使用的实例.
现在,我刚刚使用了boost并遇到了一个我面临的问题,我被迫使用智能指针(特别是shared_ptr).所以,如果我要使用shared_ptr来解决这个问题,我应该使用智能指针来解决所有正常的指针代码库吗?
Căt*_*tiș 18
你应该小心使用智能指针.在考虑内存管理时,它们不是银弹.循环引用仍然是一个问题.
在进行类设计时,始终要考虑谁拥有对象的所有权(有责任销毁该对象).如有必要,使用智能指针补充,但不要忘记所有权.
是的,你应该更喜欢智能指针而不是几乎所有的裸指针.但这并不意味着你应该在::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))是您的资源管理问题的正确答案.
是的。如果您有可用的 Boost 智能指针,您应该在大多数情况下使用它们。请记住这一点,虽然您可以并且从您的评论中确实有效地使用了指针,但在您之后的人可能不会。使用智能指针可以并且将会(希望不能防止不良代码)缓解其中一些问题。
即使您的类设计得很好,我也建议在您的类中使用scoped_ptr 。它将有助于防止下一个人在面对裸指针时可能/可能/最有可能引入的问题。通过举例,它也会鼓励他们使用它们。您最不想看到的就是必须追踪内存问题,因为有人忘记将指针初始化为 NULL 并且它通过了 if 语句检查。