似乎有两个论点为什么人们应该NULL在释放它们之后设置指针.
简短:free()不小心召唤第二次,当它被设置为时,不会崩溃NULL.
几乎总是这掩盖了一个逻辑错误,因为没有理由free()第二次调用.让应用程序崩溃并能够修复它会更安全.
它不能保证崩溃,因为有时在同一地址分配新内存.
当有两个指向同一地址的指针时,主要发生双重自由.
逻辑错误也可能导致数据损坏.
短:malloc()除非释放指针设置为,否则访问释放的指针可能会导致数据损坏,如果在同一位置分配内存NULL
NULL如果偏移足够大(someStruct->lastMember,theArray[someBigNumber]),则无法保证在访问指针时程序崩溃.而不是崩溃将导致数据损坏.
将指针设置为NULL无法解决具有相同指针值的不同指针的问题.
随意扩展这个问题.
有人可以告诉我之间的区别:
int *p;
p=(int*)malloc(10*sizeof(int));
free(p);
Run Code Online (Sandbox Code Playgroud)
要么
int *p;
p=(int*)malloc(10*sizeof(int));
p=NULL;
Run Code Online (Sandbox Code Playgroud) 看看这段代码,它是链表的一部分.
int main()
{
List* head1 = NULL;
insertFront(&head1, 1);
insertFront(&head1, 2);
print(head1);
free(head1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
另一个功能是:
void insertFront(List** head, int value)
{
List* node = (List*)malloc(sizeof(List));
node->data = value;
node->next = NULL;
node->next = *head;
*head = node;
//free(node); essentially I am not freeing node
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我的代码是否会导致内存泄漏问题?
我是否需要为节点(在函数内部)释放已分配的内存(动态)?
如果我释放head1,那么为节点分配的内存是否也会被释放?如果是,那怎么样?