【问题标题】:Heap corruption on free(...)免费的堆损坏(...)
【发布时间】:2012-02-22 13:09:07
【问题描述】:

我有这个枚举类型:

enum Cell { ALIVE='X', DEAD='O' };

我用它分配了一个数组:

h_board = (Cell*) malloc(width*height*sizeof(char));

我认为我没有做错因为 Cell 值是字符(我想保留字符大小的数据,但我关心可读性,这就是我使用 enum 的原因。)

free(h_board); 引发异常。在调试模式下,我可以看到堆损坏警告。我想我释放的内存比分配的多,但我不明白为什么。我还尝试free((char*)h_board); 尝试强制执行字符大小释放,但问题仍然存在。

我该如何解决这个问题?

【问题讨论】:

  • 您在某处覆盖了某些内容。显示一些代码?
  • h_board 的类型是什么?我假设它是Cell*。 Valgrind 告诉你什么?您能否输入重现此问题所需的最少代码并向我们展示 h_board 会发生什么?
  • 我还没有发现任何问题,但您最好使用sizeof(Cell) 而不是sizeof(char)
  • 单元格值不是字符而是整数,最好使用sizeof(Cell)
  • @cnicutar @Eregrith 最少的代码就是这样。将h_board定义为Cell*,放入main(),就可以运行了。

标签: c++ free heap-corruption


【解决方案1】:

首先,Cell 是它自己的数据类型(不一定映射到 char),所以使用 malloc 和它(另外,我们不会在 C 中转换 malloc):

Cell *h_board = malloc(width * height * sizeof(Cell));

其次,我们需要完整的代码才能准确地帮助您。这应该运行没有任何错误,也许你可以从这里构建:

#include <stdlib.h>

int main(int argc, char **argv) {
    Cell *h_board;

    h_board = malloc(20 * 30 * sizeof(*h_board));
    free(h_board);

    return 0;
}

【讨论】:

  • 我不确定是否需要发布更多代码,这就是我所需要的。谢谢。我只是想为枚举强制执行字符大小......但我想我不能。
  • kaoD:枚举的全部目的是使类型安全的简单数字常量具有良好的性能。编译器选择int 是不合逻辑的,因为这通常是实现上的字长,而字长是 CPU 处理速度最快的。如果你想要char 类型的常量,你仍然可以写const char ALIVE = 'x'; 等。
  • 顺便说一句,不投射到Cell* 是行不通的。老实说,我不确定这是 C 还是 C++(我正在为 CUDA 编程),但我需要转换它。
  • @kaoD:那么您正在编写 C++,但您将问题标记为 C。
  • @kaoD:在 C++ 中,您可以使用 new[]delete[] 代替 mallocfree
【解决方案2】:

它应该是 sizeof(Cell)。对枚举的大小做出任何假设都是危险的。 仅供参考:What is the size of an enum in C?

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2016-08-17
    • 1970-01-01
    • 2013-03-07
    • 2011-07-30
    • 1970-01-01
    相关资源
    最近更新 更多