我已经有一段时间没写C/C++了,现在我需要它的效率去完成一个项目。
据我理解,shared_ptr的作用是当我需要时删除对象。所以,如果我的对象有一个shared_ptr向量,那么在析构函数中,我就不用担心迭代这个向量并删除每个元素了?换句话说,只要使用这些,我就不用担心内存管理了?还是我完全误解了这一点?这听起来太美好了。
我已经有一段时间没写C/C++了,现在我需要它的效率去完成一个项目。
据我理解,shared_ptr的作用是当我需要时删除对象。所以,如果我的对象有一个shared_ptr向量,那么在析构函数中,我就不用担心迭代这个向量并删除每个元素了?换句话说,只要使用这些,我就不用担心内存管理了?还是我完全误解了这一点?这听起来太美好了。
func(A(), boost::shared_ptr<B>(new B));
因为编译器可以对此进行优化
tmp1 = new B;
tmp2 = A();
tmp3 = boost::shared_ptr<B>(tmp1)
func(tmp2,tmp3)
这段代码乍一看可能没什么问题,但如果 A() 抛出异常,那么 B 已经被分配了,但是 shared_ptr 还没有持有它,因此指针永远不会被释放。
在这里,我发布了关于不同的自动内存管理策略的信息。它解释了GC和引用计数之间的主要区别。
现代C++开发人员很少使用手动内存(或资源)管理之类的东西。我们大多数人使用RAII习惯用法来代替(请参阅 http://en.wikipedia.org/wiki/RAII ),即一些实用程序类帮助我们处理资源。
Shared_ptr是一种伟大的技术,可以简化例行的内存/资源管理任务。这种技术有一些缺点(无法处理循环结构,并且它在时间和空间方面具有性能开销。对于引用上的每个操作,实现现在将执行算术操作 - 在分离情况下,还有条件指令。此外,每个对象必须扩展一个额外的字段来保存计数)。
最近我参与了一个相当大的项目(只是我的部分包含了200多个类),我从未(绝对没有)手动使用过operator delete。这样的工具简化了编码、调试、维护,并显著降低了开发成本。最近我参与了一个类似的项目(具有非常相似的业务逻辑和架构),但是使用的是C#。我可以真诚地告诉你:它们非常相似(首先,因为C++项目中的自动内存管理)。
顺便说一句,没有每个C++程序员都知道,shared_ptr可以在自定义删除器的情况下用于自动资源管理(不仅仅是自动内存管理)。