【问题标题】:debug error when doing memory release释放内存时的调试错误
【发布时间】:2012-03-18 12:08:23
【问题描述】:

以下代码的目的是将错误值(-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;
}

【问题讨论】:

  • 在大小为 n 的 DFS_CODE 中,fromto 的可能值是多少?
  • 我确信这些值是正确的。当我使用delete [] code; 时会出现问题
  • 当您使用 delete[] 或 free 时会出现问题,因为您之前破坏了堆。在某些时候,您正在编写超出“代码”数组的数据,因此修改了堆块中的下一个/上一个指针。这与 delete[] 或 free 无关。
  • 感谢您的帮助!但是我仍然无法通过使用动态数组来解决这个问题...,但我通过使用map结构来解决它:)

标签: c++ compiler-errors


【解决方案1】:

我怀疑这些台词

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 是否 = 0,否则您在堆分配的数组之外进行写入,这可能导致堆损坏。

另外,您是否有理由不将数组 code 完全替换为

std::vector<int> code

?

【讨论】:

  • 我很确定你提到的情况在我的代码中不存在。我发现如果我把delete [] code; 拿出来,错误就会消失。但我不知道为什么。感谢您的回复:)
  • @Mr.mr 堆损坏检测通常发生在内存分配/释放(当堆被实际管理时)而不是内存访问。
  • @Mr.mr 你绝对应该使用 delete [] 代码。我只是说损坏可能在此之前发生,并且仅在调用堆时才被检测到。
  • 我用另一种方法来解决这个问题。感谢您的帮助:)
  • 你能帮我解决这个问题吗?谢谢:) @Doug T. stackoverflow.com/questions/9780955/…
【解决方案2】:

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

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

【讨论】:

  • 即使我初始化code,问题仍然存在。可笑的是,如果取出delete [] code;,问题就解决了……但我认为不释放内存不是一个好主意,所以我通过使用map 结构来解决这个问题。感谢您的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 2020-12-04
相关资源
最近更新 更多