【发布时间】:2013-08-21 21:14:43
【问题描述】:
我正在尝试释放使用以下代码分配的第二个数组:
int** createMatrix(int k)
{
int i;
int **res;
res = (int**)malloc(sizeof(int*)*k);
checkalloc(res);
for (i = 0; i < k; i++)
{
res[i] = (int*)malloc(sizeof(int)*k);
checkalloc(res[i]);
}
return res;
}
具有以下功能
void freeMatrix(int ***matrix, int k)
{
int i;
for (i = 0; i < k; i++)
free(matrix[i]);
free(matrix);
}
第一个元素被很好地释放,但是当i=1 函数崩溃并出现错误:
First-chance exception at 0x0f7e7e2c (msvcr100d.dll) in Q2.exe: 0xC0000005: Access violation reading location 0xccccccc8.
Unhandled exception at 0x0f7e7e2c (msvcr100d.dll) in Q2.exe: 0xC0000005: Access violation reading location 0xccccccc8.
我做错了什么?
编辑:
尝试解除分配由以下人员分配的类似数组时,我也会遇到同样的情况:
CHARS** createImageMatrix(FILE *fp, int rows, int cols, int format)
{
CHARS**res;
int i;
res = (CHARS**)malloc(sizeof(CHARS*)*rows);
checkalloc(res);
for (i = 0; i < height; i++)
{
res[i] = (CHARS*)malloc(sizeof(CHARS)*cols);
checkalloc(res[i]);
}
return res;
}
并解除分配:
void freeCharsMatrix(CHARS **matrix, int rows)
{
int i;
for (i = 0; i < rows; i++)
free(matrix[i]);
free(matrix);
}
当 CHARS 为:
typedef struct Chars {
char A;
char B;
char C;
char D;
} 个字符;
但这次我明白了:
我怎么了?
【问题讨论】:
-
您不必在 C 中强制转换 void* malloc 返回。
-
@hetepeperfan,这就是我需要分配内存的方式。这不是导致崩溃的原因。
-
您分配了一个 int** 并随后释放了一个 int***
free_matrix -
通常情况下,three star programming 是不受欢迎的,或者它至少经常表明有问题或者可能有更好的方法来解决您的问题。
-
如果您只是将返回值(来自
createMatrix())传递给freeMatrix(),那么您应该已经从编译器收到了一个警告,即您错误地调用了freeMatrix()函数。如果您将指针的地址传递给freeMatrix(),那么也许您应该在释放数据后将指针归零——并在freeMatrix()中使用额外的间接级别。如果你有关于类型不匹配的编译器警告并且忽略它们,那么你没有做任何好事。请记住,C 编译器比您(或我)更了解 C!
标签: c memory memory-management memory-leaks