C++ 在malloc_error_break中设置断点,以便在C++;
我正在编写一个程序,它接受两个命令行参数:C++ 在malloc_error_break中设置断点,以便在C++;,c++,memory-leaks,gdb,valgrind,C++,Memory Leaks,Gdb,Valgrind,我正在编写一个程序,它接受两个命令行参数:a和b 只要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
和b
只要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();
}
第74行是:
viTmp[viBrickWall[a][b]=3代码>
第40行是:
viBrickWall=iTileBricks(iPanelWidth)代码>您使用此行导致对堆内存的写入无效:
viTmp[viBrickWall[a][b]=3代码>
这意味着当时viBrickWall[a][b]
在viTmp
之外进行索引。加
int i = viBrickWall[a][b];
assert(0 <= i && i < viTmp.size());
我不知道viBrickWall
的内容,所以这只是Valgrind输出的一个有根据的猜测
我不确定您是在MacOSX上使用GNUlibstdc++
还是libc++
。如果您正在使用libstdc++
或手头有Linux设备,请声明viTmp
为std::u debug::vector
会很快发现这个问题。您需要使用调试信息进行编译,以获得有用的valgrind
输出。您好,大卫,谢谢您的提示。我更新了帖子,进一步缩小了问题范围。您介意看一下吗?valgrind
输出的第13-19行显示了问题。在这些代码行中添加assert
(或打印)语句可能有助于发现问题。@DavidSchwartz感谢您指出这一点!太棒了:)我来看看。viTmp[viBrickWall[a][b]=3代码>在行之前添加大量的assert
s。确保a
在范围内,而b
在范围内。然后确保viBrickWall[a][b]
在范围内。scott非常感谢您的见解。在看你的答案之前,我解决了这个问题,但你是对的:)非常感谢。
int i = viBrickWall[a][b];
assert(0 <= i && i < viTmp.size());
-vector<int64_t> viTmp(iK-i);
+vector<int64_t> viTmp(iK - i + 1);