栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++ 循环正常结束,莫名报double free or corruption(out)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++ 循环正常结束,莫名报double free or corruption(out)

问题描述

这里是使用vector容器,这样的报错也适用其他数据类型报同样的错误

出现这样报错的原因是我程序使用这个location_entropy全局变量,程序中间有一个局部变量eNode赋值到了location_entropy。原因在于程序在for循环结束后就会释放eNode,而location_entropy因为是全局变量,程序结束后释放,所以导致释放了两次eNode变量。主要还是push_back是引用,使用emplace_back就会完全复制eNode到location_entropy中,相当于另一个空间,不会因为eNode空间释放导致后面程序结束释放后两次释放同一个空间。

typedef struct 
{
    int totalVisitNum;//保存访问该点的总数
    int tasksNum;
    int workersNum;
}entropyNode;

void test(){
	for (int i = 0; i < gridPer.x*gridPer.y; i++)
    {
        entropyNode eNode;
        eNode.totalVisitNum=0;
        eNode.tasksNum=0;
        eNode.workersNum=0;
        location_entropy.push_back(eNode);//问题出在这一句
    }
 }

提醒大家使用全局变量时候,注意局部变量和全局变量释放的顺序

具体报错日志如下:

*** Error in `./WaterFilling': double free or corruption (out): 0x000000000041a4d0 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x81329)[0x2aaaab25a329]
/lib64/libc.so.6(+0x39ce9)[0x2aaaab212ce9]
/lib64/libc.so.6(+0x39d37)[0x2aaaab212d37]
/lib64/libc.so.6(__libc_start_main+0xfc)[0x2aaaab1fb55c]
./WaterFilling[0x402484]
======= Memory map: ========
00400000-00402000 r--p 00000000 08:11 266602910                          /home/jyj/workSpace/crowd/TOBM/algorithm/WaterFilling
00402000-00404000 r-xp 00002000 08:11 266602910                          /home/jyj/workSpace/crowd/TOBM/algorithm/WaterFilling
00404
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted (core dumped)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869056.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号