最近在运行一个较大的程序,内存占用可能有点多,其中在vector.push_back()处报错,感到很奇怪。用g++ -std=c++11编译。 程序输出及报错信息: |
|
继续补充,我加入了以下控制,没起到作用,不知道问题出在哪儿?
cout << “break = ” << ” ” << 2.22222 << endl; if (KATT.size() == KATT.capacity()) KATT.push_back(KATT2); //……….Test block 输出: |
|
内存不足吧。
|
|
我理解向量容器使用的内存是连续的。
比如说刚开始只有16*4 byte大小的空间, 如果再向里面push, 他自动回创建一个更大的空间, 比如是16*4*2 将原来的数据拷贝到新的空间, 原来的删除掉。 如果申请新的空间不足, 或没有连续空间可以使用, 就申请不到新内存。 |
|
肯定不是这样的,这样的话效率不是很低了 |
|
应该不是内存不足的问题,才两个元素就内存不足应该不会,具体是什么这样也看不出,楼主新建个工程试下
|
|
应该是这样的,vector 如果总改变大小的话,效率确实不是很高 |
|
5分 |
这个应该是你其他某个地方的内存访问越界了,覆盖到了 vector 申请的内存,导致里面一些用于内存管理的数据被破坏,然后释放内存的时候就出错了。这个错误是在释放的时候,而不是申请的时候,所以和内存不足没什么关系。
|
5分 |
我昨天也遇到过相似的问题,可以肯定的是问题不是vector.push_back()错!绝对不是!全都是内存越界了,有其他地方冲洗掉了原来的vector的内存。
比如我昨天是因为手贱使用了一个strncpy函数的时候字节写错了。 char ctemp[512] = {0}; strncpy(ctemp, str.c_str(), 1024); 所以后面512个字节就被冲成了NULL,至于为什么刚好冲了vector,我没去仔细研究内存块。 |
内存应该是足够的,本机有4G内存 |
|
我测试过,vector确实是先有固定大小,当要push的时候才会申请更多(一般是2倍当前大小)的内存。如果程序不是太大,效率就显得有些低了 |
|
可能是8楼和9楼说的,内存越界了,毕竟报错是 free()。
我后来给所有的vector提前分配了内存就没有这个问题了 KATT.clear(); KATT.reserve(1000); // 先申请1000个该类型大小的内存 但是我觉得奇怪的是,在整个程序中,我并没有使用 free(), 但是使用过用vector做函数形参,不知道是不是调用函数后程序自己把形参的内存freele 。可是为何它在其他地方没有报错,就只是在KATT这个vector这里报错了呢? |
|
5分 |
vector 扩展内存的时候有可能会先 free 掉之前申请的内存. 你这样提前分配大内存来避免错误并没有结局你代码的 BUG,隐藏起来可能导致更多的逻辑错误
|
恩,有道理。我只能通过打印输出确定错误发生的地方,更深入的跟内存相关的,我不懂程序到底怎么出错的。你知道怎么调试吗? |
|
5分 |
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。
|
你用的是什么编译器和调试软件,vc 吗?我在Ubuntu 下用的 g++ 和 gdb,gdb 目前只会几个初级的命令。。。 |
|
好的,我看到了用 bt |
|
gdb调试的话,可以观察是谁擦写了某段特定的内存,非常方便,也非常容易定位问题 |
|
这个帖子结了,欢迎大家转到另一个帖子讨论,那边分数多 。讨论到了怎么确定 程序自己 double free 了。
http://bbs.csdn.net/topics/391042217 |
|
2. 设置观察点(WatchPoint) |