执行内存释放时调试错误

时间:2012-03-18 12:08:23

标签: c++ compiler-errors

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

code.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 struct来存储正确的值。感谢所有帮助我的人!最好的问候!

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

2 个答案:

答案 0 :(得分:2)

对我来说可疑这些行

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是否&lt; DFS_CODE.size()和&gt; = 0,否则您在堆分配的数组之外写入,这可能导致堆损坏。

另外,有没有理由不用

完全替换数组code
std::vector<int> code

答案 1 :(得分:0)

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

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接收未定义的值,这不是你的问题,但是可疑......