C++ 使用指南:共享指针与普通指针

C++ 使用指南:共享指针与普通指针,c++,C++,是否有一个严格的指导原则,当人们最好使用boost::shared_ptr而不是普通指针(T*),反之亦然?我的一般规则是,当内存被大量传递,很难说是什么拥有了这些内存时,应该使用共享指针。(请注意,这也可能表明设计不好,所以在使用共享指针之前先考虑一下。)如果您在一个地方使用共享指针,那么应该尝试在任何地方使用它们。如果你不这样做,你必须非常小心你如何传递指针,以避免双重自由 如果你的内存使用很简单,而且很明显什么拥有内存,那么就使用普通的指针 通常,项目越大,共享指针的好处就越大。这方面没有

是否有一个严格的指导原则,当人们最好使用boost::shared_ptr而不是普通指针(T*),反之亦然?

我的一般规则是,当内存被大量传递,很难说是什么拥有了这些内存时,应该使用共享指针。(请注意,这也可能表明设计不好,所以在使用共享指针之前先考虑一下。)如果您在一个地方使用共享指针,那么应该尝试在任何地方使用它们。如果你不这样做,你必须非常小心你如何传递指针,以避免双重自由

如果你的内存使用很简单,而且很明显什么拥有内存,那么就使用普通的指针


通常,项目越大,共享指针的好处就越大。这方面没有严格的规定,也不应该有。与许多开发决策一样,存在权衡,您必须做对您最有利的事情。

我的一般规则是,当内存大量传递时,很难说是什么拥有该内存,应该使用共享指针。(请注意,这也可能表明设计不好,所以在使用共享指针之前先考虑一下。)如果您在一个地方使用共享指针,那么应该尝试在任何地方使用它们。如果你不这样做,你必须非常小心你如何传递指针,以避免双重自由

如果你的内存使用很简单,而且很明显什么拥有内存,那么就使用普通的指针

通常,项目越大,共享指针的好处就越大。这方面没有严格的规定,也不应该有。与许多开发决策一样,存在权衡,您必须做对您最有利的事情

一个简单的指南 消除了记忆的可能性 漏洞是:始终使用命名的智能 用于保存结果的指针变量 新建

-

一个简单的指南 消除了记忆的可能性 漏洞是:始终使用命名的智能 用于保存结果的指针变量 新建


-

除非您正在构建智能指针(不要),否则您可能不应该使用原始指针(这样会导致疯狂)

有一组适用于不同情况的智能指针:
std::auto_ptr:
std::tr1::shared_ptr AKA(boost::shared_ptr)
boost::作用域_ptr
boost::弱ptr

传递指针的唯一原因是传递对一个可能为NULL的对象的引用(否则使用引用),也就是说,你正在而不是传递所有权,只是传递对象的使用权(如果你传递NULL,也许你应该查看代码并问为什么)


std容器不能很好地处理引用,因此您可以将指向其他人拥有的对象的指针放在标准容器中(请参见)

除非您正在构建智能指针(不要),否则您可能不应该使用原始指针(这样会导致疯狂)

有一组适用于不同情况的智能指针:
std::auto_ptr:
std::tr1::shared_ptr AKA(boost::shared_ptr)
boost::作用域_ptr
boost::弱ptr

传递指针的唯一原因是传递对一个可能为NULL的对象的引用(否则使用引用),也就是说,你正在而不是传递所有权,只是传递对象的使用权(如果你传递NULL,也许你应该查看代码并问为什么)



std容器不能很好地处理引用,因此您可以将指向其他人拥有的对象的指针放在标准容器中(请参见)

您指的是
boost::shared_ptr
std::tr1::shared_ptr
?您实际上不应该使用原始指针。但它们是针对不同情况的多个共享指针。请参见您所指的是
boost::shared_ptr
std::tr1::shared_ptr
?您实际上不应该使用原始指针。但它们是针对不同情况的多个共享指针。看看你是否只担心新的内存泄漏,你可以使用
自动\u ptr
,而不需要
共享\u ptr
的开销,与创建对象共享指针。如果您不小心,auto_ptr的非标准复制语义可能会对您造成严重影响。@Matt:编译器在优化共享_ptr方面做得很好,开销很小。使用auto_ptr它的设计用途(所有权移动)。在单个作用域内,作用域的\u ptr是更好的选择。@弗雷德:如果你了解什么是自动\u ptr,它是最有用的智能指针。像所有的软件一样,不要滥用它,它不会咬到你。如果你只担心新软件的内存泄漏,你可以使用
auto\u ptr
,而不需要
共享的开销。只要没有,你知道,与创建对象共享指针。如果您不小心,auto_ptr的非标准复制语义可能会对您造成严重影响。@Matt:编译器在优化共享_ptr方面做得很好,开销很小。使用auto_ptr它的设计用途(所有权移动)。在单个作用域内,作用域的\u ptr是更好的选择。@弗雷德:如果你了解什么是自动\u ptr,它是最有用的智能指针。就像所有的软软件一样,不要滥用它,它不会咬你。我的规则是,如果很难说“什么拥有了那份记忆”,你的设计就很糟糕。应用共享指针创可贴并不能解决问题。@NNeil,明确指针所有权与设计无关。@jon所有权和生命周期是任何设计都必须解决和解决的两个最重要问题之一specify@jon在C++世界所有权就是一切。如果没有它,我们也可以使用C。即使在一个好的设计中,共享指针也会大大降低内存泄漏和双重释放错误的可能性。程序员不再需要担心确保每个代码路径都是fre