进行内存释放时出现调试错误

debug error when doing memory release

本文关键字:调试 错误 内存 释放      更新时间:2023-10-16

以下代码的目的是将错误值(-1)更正为正确值,但当我使用动态数组记录正确值时,会发生调试错误。有人能帮我吗?谢谢

代码.cpp

int size = DFS_CODE.size();
int *code = new int[DFS_CODE.size()];
for(int i = 0; i < DFS_CODE.size(); i++) {
    if(DFS_CODE[i].fromlabel == -1)
        DFS_CODE[i].fromlabel = code[DFS_CODE[i].from];
    else if(DFS_CODE[i].tolabel == -1)
        DFS_CODE[i].tolabel = code[DFS_CODE[i].to];
    code[DFS_CODE[i].from] = DFS_CODE[i].fromlabel;
    code[DFS_CODE[i].to] = DFS_CODE[i].tolabel;
    cout << DFS_CODE[i].from << "(" << DFS_CODE[i].fromlabel << ") => "
         << DFS_CODE[i].to << "(" << DFS_CODE[i].tolabel << ")" << endl;
}
delete [] code;

调试错误

debug error!
HEAP CORRUPTION DETECTED:after Normal block(#1363) at 0x005745F0. 
CRT detected that the application wrote to memory after end of heap buffer.

我发现当我使用malloc时也会发生调试错误。当我使用delete [] code;free(code);时,会发生调试错误。为什么?我不应该释放记忆吗?

我通过另一种方式解决了这个问题,我使用map结构来存储正确的值。感谢所有帮助我的人!顺致敬意,

map <int, int> code;
for(int i = 0; i < DFS_CODE.size(); i++) {
    if(DFS_CODE[i].fromlabel != -1)
        code[DFS_CODE[i].from] = DFS_CODE[i].fromlabel;
    if(DFS_CODE[i].tolabel != -1)
        code[DFS_CODE[i].to] = DFS_CODE[i].tolabel;
    cout << DFS_CODE[i].from << "(" << code[DFS_CODE[i].from] << ") => "
         << DFS_CODE[i].to << "(" << code[DFS_CODE[i].to] << ")" << endl;
}

我怀疑这些线路是

code[DFS_CODE[i].from] = DFS_CODE[i].fromlabel;
code[DFS_CODE[i].to] = DFS_CODE[i].tolabel;

当您按照以下分配代码时

int *code = new int[DFS_CODE.size()];

请确保检查.from和.to是否<DFS_CODE.size()和>=0,否则您在堆分配的数组之外进行写入,这可能会导致堆损坏。

此外,是否有原因不将阵列code完全替换为

std::vector<int> code

请注意,当您为"代码"分配内存时,它不会初始化

int *code = new int[DFS_CODE.size()];

下面的代码使用它…

for(int i = 0; i < DFS_CODE.size(); i++) {
    if(DFS_CODE[i].fromlabel == -1)
        DFS_CODE[i].fromlabel = code[DFS_CODE[i].from];
    else if(DFS_CODE[i].tolabel == -1)
        DFS_CODE[i].tolabel = code[DFS_CODE[i].to];

这可能会导致DFS_CODE接收到未定义的值,这不是你的问题,但很可疑。。。