【C/C++笔记】之vector的clear和swap清除元素的区别以及用shrink_to_fit()优化空间_醉逍遥_祥的博客-CSDN博客
最开始遇到程序内部内存占用随着数据接收一直在增长,后续通过查看代码是vector一直在push_back() , 但是没有释放
尝试一:添加了vector的clear()方式清理内存,添加后内存占用还是无变化,只有在kill掉进程后内存占用才会下降(后续才知道clear()只是清理了vector内部元素,但是申请的空间未释放)。
尝试二:使用vector的swap()清理掉内存,但是内存依旧无变化。
尝试三:再仔细看每个vector的内部数据结构,发现vector_A的数据是使用malloc申请的内存,故需要特殊处理,free()掉其中每个元素,此次操作后内存占用依旧无变化。
尝试三: 在一段段屏蔽代码后发现vector_A在push_back()的时候发生了拷贝,然后临时变量未free,后续添加了临时变量的释放,程序内存占用问题得到解决(其中比较费解的是临时变量没有free掉,为什么会影响vector_A以及其他vector内存的清理)。
#include <vector>
struct test_data{
int* a;
int* b;
}
typedef laser_data* LDP;
int* alloc_int_array(int n, int def);
LDP ld_alloc_new(int nrays) {
LDP ld = (LDP) malloc(sizeof(struct test_data));
ld_alloc(ld, nrays);
return ld;
}
int* alloc_int_array(int n, int def) {
int *v = (int*) malloc(sizeof(int)*n);
int i=0; for(i=0;i<n;i++) {
v[i] = def;
}
return v;
}
void ld_alloc(LDP ld, int nrays) {
ld->a= alloc_int_array(nrays, 0);
ld->b= alloc_int_array(nrays, 0);
}
void ld_free(LDP ld) {
ld_dealloc(ld);
free(ld);
}
void ld_dealloc(struct test_data*ld){
free(ld->a);
free(ld->b);
}
void clear_vector(std::vector<LDP>& ld_v){
for(auto e : ld_v){
ld_free(e);
}
std::vector<test_data>().swap(ld_v);
ld_v.clear();
ld_v.shrink_to_fit();
}
int main()
{
LDP single_ldp = ld_alloc_new(10);
std::vector<LDP> laser_data1;
laser_data1.push_back(single_ldp);
clear_vector(laser_data1);
}