经过上一篇文章 关于内存泄漏的原理
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的底层实现很重要,只有知道了这些才能看清楚本质。