65,212
社区成员
发帖
与我相关
我的任务
分享稍微有点大的C++程序,在exe文件运行时,运行一段时间(十几个小时)之后,出现了内存abort错误,跳出对话框
。
之后又尝试在源代码中加入Trace语句进行debug调试,调试运行了多次,最终确定在程序文件的Line18505:vector< list<EDGE> > slNet(LayerYmax - LayerYmin + 1);,即声明容器vector语句时内存报错:



,内存异常。
猜想应该是在函数中,声明的此vector对象,内存没有正确释放,程序多次调用此函数,造成内存累计过多。
但我在函数的结尾,有对此vector对象进行内存释放,相应语句为:
slNet.erase(slNet.begin(), slNet.end());
vector< std::list<EDGE> >().swap(slNet);
slNet.clear();
slNet.shrink_to_fit();
但调试运行程序多次,程序中断报错依然定位在Line18505:vector< list<EDGE> > slNet(LayerYmax - LayerYmin + 1);语句。
实在找不到问题在哪,望有大佬 能指点指导一下,十分感谢!
说明:EDGE是结构体,内容如图
补充:这几天我把相关代码的函数整理成一个cpp格式文件,用内存检测工具Valgrind和Address Sanitizer,在centOS上运行检测内存泄漏,检测无泄漏,搞不懂是怎么回事了??

这个错误可能是由于LayerYmax和LayerYmin的值过大,导致在创建vector<list>时内存不足。你可以尝试减小这两个值的范围,或者检查是否有其他代码占用了大量内存。
LayerYmax - LayerYmin + 1是不是为负数,导致申请内存为uint64最大值

你这种构造函数是错误的。
先要有list的构造原函数。
如:
vector<list>s(list(10),10);
我记的,现在搞不清了,记忆不好了。

先释放list的数据,再释放list,再释放vector。
你只是清掉了vector中的list元素,list中的EDGE(不清楚EDGE是指针还是其他什么)还在,它游离在你的系统中,不断增长。
内存爆了,无法再分配新的空间。
释放次序是否有问题?目前,数组和链表操作好像不支持集群正则,需要一个一个遍历、然后逐个单独操作。你试一下这个代码,应该会造成系统报错。int d[10]; int s[10]; s[]={5,6,7,8,9,0,1,2,3,4}; d[] = s[]; //no such operator!