'free(): invalid next sign (fast)' 错误的真正含义是什么?
What does the 'free(): invalid next sign (fast)' error really mean?
假设我有一个分配和释放内存的程序foo
。我 运行 是这样的:
./foo something.foo
它运行完美,退出时没有错误。现在,如果我将文件的第一行设置为 #!/path/foo
,更改权限,并将 运行 设置为 ./something.foo
,程序 运行s 正确,但在退出之前,我看到这个:
*** Error in '/path/foo': free(): invalid next size(fast): 0x019e2008 ***
Aborted
我看到很多关于free(): invalid next sign(fast)
的问题,都有具体的代码示例。所以我有两个问题:
- 为什么使用
#!/path/foo
而不是 ./foo
时会出现错误?
- 错误的确切含义 - 出现错误必须满足什么条件?
嗯,通过更改
解决了这个问题
some_var = malloc(sizeof(char *));
至
some_var = malloc(CONSTANT);
这意味着您的程序中存在堆损坏。该消息告诉您 C 库是如何检测到损坏的,而不是损坏是如何发生的。
堆损坏是一个特别难以追踪的错误,因为它通常不会在错误发生时出现,而是在稍后出现。程序很可能在损坏的情况下继续工作,这意味着它可能是一个错误,它已经存在于您的代码中数周或数月,并且与您正在测试和调试的任何最近的更改无关。
对堆损坏的最佳响应通常是像 valgrind 这样的工具,它可以 运行 与您的程序一起使用,并且通常(尽管不总是)能够查明有问题的代码在哪里.
假设我有一个分配和释放内存的程序foo
。我 运行 是这样的:
./foo something.foo
它运行完美,退出时没有错误。现在,如果我将文件的第一行设置为 #!/path/foo
,更改权限,并将 运行 设置为 ./something.foo
,程序 运行s 正确,但在退出之前,我看到这个:
*** Error in '/path/foo': free(): invalid next size(fast): 0x019e2008 ***
Aborted
我看到很多关于free(): invalid next sign(fast)
的问题,都有具体的代码示例。所以我有两个问题:
- 为什么使用
#!/path/foo
而不是./foo
时会出现错误? - 错误的确切含义 - 出现错误必须满足什么条件?
嗯,通过更改
解决了这个问题some_var = malloc(sizeof(char *));
至
some_var = malloc(CONSTANT);
这意味着您的程序中存在堆损坏。该消息告诉您 C 库是如何检测到损坏的,而不是损坏是如何发生的。
堆损坏是一个特别难以追踪的错误,因为它通常不会在错误发生时出现,而是在稍后出现。程序很可能在损坏的情况下继续工作,这意味着它可能是一个错误,它已经存在于您的代码中数周或数月,并且与您正在测试和调试的任何最近的更改无关。
对堆损坏的最佳响应通常是像 valgrind 这样的工具,它可以 运行 与您的程序一起使用,并且通常(尽管不总是)能够查明有问题的代码在哪里.