这里介绍了一种很好的关于STL容器进行大容量动态内存管理的方法:【C++】动态内存管理(五)使用STL容器进行大量的动态内存管理
介绍的内容有几层,首先第一个是:
对于STL容器vector,比如经常采用的是一种拷贝构造的方式进行的push_back(),意思是由于vector申请的空间不是很大,所以如果不指定大小,那么可能内存就只能存放一个对象。
所以其实这就涉及到,指定申请空间大小的问题,转向到:C++STL对象指定内存空间大小
这样新的对象添加的时候,就涉及到寻找更大连续内存的问题,移动拷贝对象,释放之前的内存空间,然后再添加,这样的效率就不是很高
一个解决方法,就是用指针代替传入的拷贝的副本,但是这样的问题就是当我们使用的STL容器的生命周期结束的时候,内部指针所指向的对象并不会被析构掉,即存在内存泄露的问题,这就可以转向到另外一个链接:C++如何造成以及如何避免内存泄露 以及
C++如何对内存泄漏进行检查(我是辣鸡,我是傻逼,5555),还有一个检测工具,在linux环境下的,看着还比较好用C/C++ 内存泄漏检测工具:Valgrind
然后文章给的一个解决思路就是,使用智能指针,智能指针的确是效率和复杂度和普通指针是一样的,而且会智能动态的释放掉指向的资源对象。文中给的智能指针使用的是shared_ptr,
--------------------------以下分割线摘录自原文---------------------------------------------------
shared_ptr在非环状数据结构中可以很好的发挥其特性,防止资源泄露,让资源都能得到很好的释放和管理。
做一下总结,说明为什么最好要在vector中放shared_ptr:
防止直接放对象时,push_back() 一个new出来的源对象之后,忘记去delete掉源对象导致内存泄漏
shared_ptr可以很好的保证你new出来的内容都能很好的被释放掉
shared_ptr采用引用计数的方式,就算被push_back()的源shared_ptr已经析构掉了,但是其保留的资源还存在于vector的内部shared_ptr指针上,不用担心资源被不小心释放
放shared_ptr可以实现多态,而放普通对象不行,普通指针则不好管理内存的分配和释放
--------------------------以上分割线摘录自原文---------------------------------------------------
文中介绍的内存管理都是用顺序容器vector进行举例的,那关联容器的效果呢?