C++中直接定义一个vector,像下面这样一般认为不用手动释放内存,因为离开作用域后会自动释放vector申请的内存,而使用new动态申请内存进行初始化的则需要手动delate。
vector<int> v(1000);//不需要手动释放内存
vector<int> *v=new vector<int>();//需要手动释放内存
但今天在实验中在一个函数中定义了一个一千万的vector,单独调用时并不会产生内存问题。
但当这个函数在一个循环中被连续多次调用会出现如下报错。
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= PID 1107 RUNNING AT node3
= EXIT CODE: 139
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
基于经验,无非是两种可能,一、代码写错了,访问了不该访问的地方,二、内存爆了,按道理内存爆了几乎不可能。首先,一次调用内存不爆,多次调用就有问题?虽然函数有比较大的vector,但是我200G内存,再加上vector超出作用域会自动回收,应该是没问题的。
检查代码后认为代码没问题,最后使用手动释放内存,不再报错。
我的猜想:C++自动释放超过作用域的vector的内存的操作是有一定延迟的,在使用较小的vector时可以利用自动回收内存的机制,而当数据量较大时建议使用手动释放内存的方式。
下面是具体释放内存的方式。
v.clear();//清空元素
std::vector<int>(v).swap(v);//与临时vector交换,实现内存释放
欢迎大家讨论
、、、、、、、、、、、、、、、、、、、、、、、、
我又实验了一下还是有问题不过比之前好那么一点
、、、、、、、、、、、、、、、、、、、、、、、、
又研究了一下,我的想法有问题,它的内存在作用域结束后就会释放,因为作用域结束后就会自动调用析构函数,析构函数内部有释放内存的操作,手动释放与机制释放是没有区别的。
而我程序的问题也被我找到了,我的函数并非每次都使用相同大小的内存,而是每次调用会增加一点内存,但这并不是程序爆掉的原因。真正原因是我在使用别人函数时申请了一块内存,它内部是使用new申请的动态内存,在函数结束时并没有释放。
、、、、、、、、、、、、、、、、、、、、、、、、、、、
这件事算是解决了,总之在使用C++编程,特别是比较大的内存消耗时,使用new申请动态空间时一定要注意内存的申请与释放。除此之外,我认为可以将很多东西写在类里面,然后在析构函数里释放内存,这样在具体操作时,离开作用域的对象会自动调用析构函数释放内存,这样也是一个不错的内存管理的方案。