自由堆损坏(...)
我有这个枚举类型:自由堆损坏(...)
enum Cell { ALIVE='X', DEAD='O' };
而且我分配一个与它的数组:
h_board = (Cell*) malloc(width*height*sizeof(char));
我认为我没有这样做错误,因为单元格值是字符(我想留在char大小的数据,但我关心可读性,这就是为什么我使用枚举。)
当free(h_board);
引发异常。在调试模式下,我可以看到堆损坏警告。我想我释放的内存比我分配的更多,但我看不出为什么。我也尝试free((char*)h_board);
试图强制char大小释放,但问题仍然存在。
我该如何解决这个问题?
首先,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 2012-02-22 13:16:42
kaoD:枚举的全部目的是使类型安全的简单数值常量具有良好的性能。编译器选择'int'比逻辑更合理,因为这通常是实现中的字大小,而字大小是CPU处理速度最快的。如果你想要的类型为'char'的常量,你仍然可以写'const char ALIVE ='x';'等等 – orlp 2012-02-22 13:18:21
顺便说一句,不要强制转换为'Cell *'将不起作用。说实话,我不确定这是C还是C++(我正在为CUDA编程),但是我需要将它投射出去。 – kaoD 2012-02-22 13:19:54
您正在覆盖某处。显示一些代码? – cnicutar 2012-02-22 13:11:02
h_board的类型是什么?我认为它是'Cell *'。 Valgrind告诉你什么?你可以把最小代码重新创建这个问题,并告诉我们什么发生在h_board? – Eregrith 2012-02-22 13:11:35
我还没有看到任何错误,但是您最好使用'sizeof(Cell)'而不是'sizeof(char)'。 – kennytm 2012-02-22 13:12:09