如果我有一个类似以下的 C 语言程序:
SomeTypePtr my_type;
my_type = malloc(sizeof(someType));
/* do stuff */
free(my_type);
/* do a bunch of more stuff */
free(my_type);
调用'free'函数会对'my_type'造成任何伤害吗?在我调用'free(my_type)'后,指针会再次变为null指针吗?
如果我有一个类似以下的 C 语言程序:
SomeTypePtr my_type;
my_type = malloc(sizeof(someType));
/* do stuff */
free(my_type);
/* do a bunch of more stuff */
free(my_type);
调用'free'函数会对'my_type'造成任何伤害吗?在我调用'free(my_type)'后,指针会再次变为null指针吗?
free
释放内存区域并不会使指针内容变为NULL。假设你有int *a = malloc(sizeof(int))
,且a
的值为0xdeadbeef
,执行free(a)
后,a
仍然包含0xdeadbeef
,但是free
调用后,该内存地址不再为您保留。这就好比你租了一套通过malloc
使用的公寓一段时间,然后通过free
归还了公寓,此后你可能仍然持有复制的钥匙,但是该公寓已经不再为你所保留。
对已经被free
释放的内存再次进行free
将导致双重释放内存破坏。
free(pointer)
后始终手动将指针设置为 NULL
。 - AshSEGV
错误。 :) - sarnold不重复其他答案的内容,一旦您调用了free()
,您就需要将空指针置为NULL。在同一分配上两次调用free()
会导致堆损坏。
SomeTypePtr my_type;
my_type = malloc(sizeof(someType));
/* do stuff */
free(my_type);
my_type = 0; // Throw away the pointer to released memory, so cannot either free it or use it in any way.
/* do a bunch of more stuff */
free(my_type); // OK now - calling free(0) is safe.
只有当你认为摧毁你的堆栈是“有害”的时候,free()
才会使你的指针为空。