Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在malloc_error_break中设置断点,以便在C++;_C++_Memory Leaks_Gdb_Valgrind - Fatal编程技术网

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上使用GNU
libstdc++
还是
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);