此代码段单独工作正常,但是一旦我将其集成到完整的main()
函数中,我会发现free(0
ING的问题,有时在第一次迭代时失败,有时会随机失败我和有时尝试释放int
指针指针时。
int main()
{
int** GPRIListedCoords = calloc(sizeof(int*), GPRIMaxVal);
int i;
for(i = 0; i < GPRIMaxVal; i++)
GPRIListedCoords[i] = calloc(sizeof(int) , 2);
for( i = 0; i < GPRIMaxVal; i++ )
free(GPRIListedCoords[i]);
free(GPRIListedCoords);
return 0;
}
我以同样的方式创建/释放指针(指针)的情况。
我尝试捕获任何无效指针,但没有得到任何指针。
GDB堆栈信息:http://i.snag.gy/z3zqv.jpg
此代码样本看起来不错。我认为问题是在另一种情况下,您 do 用分配的指针做些事情。根据free()
的人页(重点是我的)
void free(void *ptr);
free()
函数释放由ptr
,指向的内存空间,该空间必须由以前的调用返回到malloc()
,calloc()
或realloc()
。否则,如果之前已经调用了free(ptr)
,则会发生未定义的行为。如果PTR为NULL
,则不会执行操作。
因此,在这种情况下,如果更改了calloc()
-ED指针,您将面临未定义的行为。
您可以使用调试器(例如Linux上的gdb
)来检查分配的内存位置,并查看指针是否更改。
此代码看起来不错。但是,如果您的代码的任何部分都在调用未定义的行为,那么它可能会损坏内部Malloc数据结构,然后在此处造成崩溃。
您可以在Linux上运行程序吗?我发现使用Valgrind(Linux工具)通常可以摆脱此类错误。