C++的vector正确释放内存方式

【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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值