c++ - 在 malloc_error_break 中设置断点以在 C++ 中进行调试

标签 c++ memory-leaks gdb valgrind

我正在编写一个接受 2 个命令行参数的程序:ab分别。

只要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 报告的拷贝:

Report hosted in pastebin

编辑

我用调试标志编译了程序:

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);

最佳答案

您使用此行导致对堆内存的无效写入:

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 会捕获此问题很快。

关于c++ - 在 malloc_error_break 中设置断点以在 C++ 中进行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13437748/

相关文章:

c++ - 在 C++ 中寻找 MemoryStream

sqlite sqlite3_close()不会释放获取的内存

c++ - 我找不到此函数中的内存泄漏 (SDL/OpenGL)

python - Cython容器不释放内存吗?

python - gdb API 预处理器宏

c++ - Clang 不会注意到默认模板参数

c++ - CGAL:多边形重叠测试

c++ - clGetPlatformIDs 在 linux 上安装 intel 时返回 -1001

无法访问地址为 ""的内存 (gdb)

c++ - 为什么std::cout无法为我的int8_t数字输出正确的值?