我在网络上和我的高级C课程中看到了很多错误的代码(例如下面的代码)。虽然我知道这是不好的编码实践,但除了浪费CPU周期之外,我很难理解它有什么坏处。据我目前的了解,如果指针分配未位于“malloc表”中(缺乏更好的词汇),通常会被忽略。我希望这里的某个人能够更好地解释为什么这样做是不好的,并且(除了这是一个愚蠢的事情)其后果是什么。
char* ptr = malloc(1);
...
free(ptr);
...
free(ptr);
我在网络上和我的高级C课程中看到了很多错误的代码(例如下面的代码)。虽然我知道这是不好的编码实践,但除了浪费CPU周期之外,我很难理解它有什么坏处。据我目前的了解,如果指针分配未位于“malloc表”中(缺乏更好的词汇),通常会被忽略。我希望这里的某个人能够更好地解释为什么这样做是不好的,并且(除了这是一个愚蠢的事情)其后果是什么。
char* ptr = malloc(1);
...
free(ptr);
...
free(ptr);
考虑您的示例,在 free(ptr) 之后执行以下操作:
char* ptr = malloc(1);
free(ptr) // <-- This will delete the pointer
ptr2 = malloc(1) // <-- now you request again
现在malloc就是它本来的样子,可以返回和ptr相同的指针,如果它确实这样做了,现在你就可以执行以下操作:
// if you call me again and if ptr2 == ptr oops!
free(ptr)
-- 你释放了ptr2导致出现了意外的行为,有大量的崩溃、痛苦和数小时的调试。
ptr
会有一个值?第二次调用 free(ptr)
时,此时 ptr
的值是什么? 我指的是我们没有将其设置为 NULL
的示例...所以,在 free(ptr)
之后,ptr
是什么?我有点新手。我还在缺少一些细节(或者说_基础知识_),我想。 - harpervillefree
调用时,ptr
的值将与第一次free
调用时相同。在调用free
后,ptr
的值不会改变。 - nishanthshanmughamfree()
是未定义行为,这意味着程序可以以任意的方式运行。程序可能完美地工作,或在测试中崩溃,或通过所有测试然后在客户面前崩溃,或可能会损坏某些数据,或可能会发射核弹等。所有这些都是未定义行为的有效表现。free
或realloc
释放,则行为是未定义的。char* ptr = malloc(1);
...
free(ptr);
ptr = NULL;
...
free(ptr);
malloc
的代码,由一些不相关的管理其自己内存的代码。如果它恰好获得与此相同的地址,则会被错误的第二个free
释放,留下悬空指针。 - Mike Seymour