我正在编写一个程序,它分别带有2个命令行参数:a
和b
。
只要a <= 17.5
只要a > 17.5
程序抛出以下错误:
释放对象的校验和不正确 - 对象可能在被释放后被修改
我已将问题缩小到以下代码:
for(int a=0; a < viBrickWall.size(); a++) {
vector<int64_t> viTmp(iK-i);
fill(viTmp.begin(),viTmp.end(),2);
for(int b = 0; b < viBrickWall[a].size(); b++) {
viTmp[viBrickWall[a][b]] = 3;
}
viResult.push_back(viTmp);
viTmp.clear();
}
删除后一段代码,摆脱错误。
我也在使用valgrind调试内存,但我找不到任何解决方案。
这是valgrind报告的副本:
修改
我用调试标志编译了程序:
g++ -g -O0 -fno-inline program.cpp
并使用valgrind运行它,如下所示:
`valgrind --leak-check = full --show-reachable = yes --dsymutil = yes ./a.out 48 10``
我注意到以下一行:
==15318== Invalid write of size 8
==15318== at 0x100001719: iTileBricks(int) (test.cpp:74)
==15318== by 0x100001D7D: main (test.cpp:40)
第74行是:
viTmp[viBrickWall[a][b]] = 3;
和第40行是:
viBrickWall = iTileBricks(iPanelWidth);
答案 0 :(得分:3)
使用以下行导致堆内存写入无效:
viTmp[viBrickWall[a][b]] = 3;
这意味着当时viBrickWall[a][b]
正在viTmp
之外进行索引。添加
int i = viBrickWall[a][b];
assert(0 <= i && i < viTmp.size());
商店前的 viTmp[i] = 3
。
提示:可能会将viTmp的大小增加一个来修复它:
-vector<int64_t> viTmp(iK-i);
+vector<int64_t> viTmp(iK - i + 1);
我不知道viBrickWall
的内容,所以这只是来自Valgrind输出的有根据的猜测。
我不确定您是否在Mac OSX上使用GNU libstdc++
或libc++
。如果您正在使用libstdc++
或方便使用Linux,请将viTmp
声明为std::__debug::vector
,以便快速解决此问题。