此代码段本身可以正常工作,但是一旦我将其集成到我的完整main()
函数中,我就会遇到free(0
的问题,有时会在第一次迭代时失败,有时会在随机失败我和有时当我尝试释放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;
}
我以相同的方式创建/释放char指针(指针),没有任何问题。
我尝试捕获任何空指针,但我没有得到任何指针。
GDB Stack信息:http://i.snag.gy/Z3ZqV.jpg
答案 0 :(得分:1)
此代码示例看起来很好。我认为问题出在另一种情况下,你用其分配的指针做。根据{{1}}的{{3}}(强调我的)
free()
void free(void *ptr);
函数释放free()
,指向的内存空间,该内存空间必须是之前调用ptr
,malloc()
或{{ 1}} 即可。否则,或者如果之前已调用calloc()
,则会发生未定义的行为。如果ptr为realloc()
,则不执行任何操作。
因此,在这种情况下,如果更改了free(ptr)
- ed指针,您将面临man page。
您可以使用调试器(例如,Linux上的NULL
)来检查分配的内存位置,并查看指针是否已更改。
答案 1 :(得分:0)
此代码看起来很好。但是,如果代码的任何部分正在调用未定义的行为,那么它可能会破坏内部malloc数据结构,从而导致崩溃。
你可以在Linux上运行你的程序吗?我发现使用valgrind(Linux工具)经常可以摆脱这些错误。