误用vector内存泄漏验证(二)

经过上一篇文章 关于内存泄漏的原理

https://blog.csdn.net/u011569253/article/details/118332076

之后再次基础上做一个验证,验证是否符合自己的猜想。/

struct FieldInfo {
    std::string value;
    std::vector<std::string> multi_value;
    bool valid_discrete_feature_ = false;
    FieldInfo() {
    }
    FieldInfo(std::string& single_value) : value(single_value) {
    }
};

//简单的demo
int main(){
     //模拟多线程并发创建10个线程
    pthread_t tids[NUM_THREADS];
    for(int i = 0; i < NUM_THREADS; ++i)
    {
        //参数依次是:创建的线程id,线程参数,调用的函数,传入的函数参数
        int ret = pthread_create(&tids[i], NULL, say_hello, &i);
        if (ret != 0)
        {
            std::cout << "pthread_create error: error_code=" << ret << std::endl;
        }
    }
    //等各个线程退出后,进程才结束,否则进程强制结束了,线程可能还没反应过来;
    pthread_exit(NULL);

    return 0;
}

// 线程的运行函数
void* say_hello(void* args)
{
    int count =0;
    //int key = (int*)args
    while(1){
        for (int idea_count = 0; idea_count < 50; ++idea_count){
            TransformAdFields(idea_count);
        }
    }
    return 0;
}

void TransformAdFields(int key){
    std::vector<FieldInfo> ad_fields(1024);//创建局部对象
    for(int i = 0;i < key;i++){
        TransformAds(ad_fields, i);
    }
}

void TransformAds(std::vector<FieldInfo>& ad_fields,int key){
    ad_fields.clear();//每次循环赋值之前都进行clear操作
    for(int i = FIELD_ACCOUNT_ID; i <= FIELD_COMPANY_NAME; i++){
        ad_fields[i].value = GetRandom(key);
    }
}

//获取随机长度字符串
std::string GetRandom(int i){
    std::string rec;
    std::random_device rd; // 非确定性随机数生成设备
    std::default_random_engine e1; // 使用默认的初始化种子
    std::default_random_engine e2(rd()); // 不确定的数作为初始化种子,每次运行结果都不一样
    char c[50]= "0123456789abcdefghigklmnokqrstuvwxyz!@#$%^&*_,-";

    std::uniform_int_distribution<> len((i+1)*10, (i+1)*20); //长度
    std::uniform_int_distribution<> uid(0, 45); // 包含上下限
    int l = len(e2);
    for(int i = 0; i<l; i++){
        rec += c[uid(e2)];
    }

    return rec;
}






以上就是简单的demo代码,不知道你是否能在这段代码中发现内存泄漏呢?

运行程序后 内存直线上升,符合预期。

去掉clear()函数试一下,没有内存泄漏。

整段代码没有任何的new/malloc等内存申请函数,缺出现内存泄漏。所以要了解我们使用std的底层实现很重要,只有知道了这些才能看清楚本质。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值