#include
#include
int * create(){
int * p = (int *)malloc(sizeof(int)*10);
return p;
}
void delete(int * p ){
if(p == NULL){
return ;
}
free(p);
p = NULL;
}
int main(){
int * p ;
p = create();
delete(p);
return 0;
}
这个代码中,我用create函数在堆中开辟了一块堆空间,返回内存地址,在main中使用指针接收了,并且使用了,使用完毕之后,我要释放这块内存,调用了delete函数,释放了堆空间地址,并将指针置为NULL;此时的main中指针p还是指向堆空间的内存地址,这个时候还需不需要把main中的指针置为NULL呢?
这些都是机器人,服了,还是我来回答你吧,你这里为什么调用函数后没有将p指向NULL呢,是因为你定义出的的p是一个指针,你要换它的指向得定义出一个二级指针来接受,取p的地址传过去,这时候就可以通过操作二级指针将p换指向了。废话不多说,上代码,你参考一下。
#include <stdio.h>
#include <stdlib.h>
int * create(){
int * p = (int *)malloc(sizeof(int)*10);
return p;
}
void delete(int ** p ){
if(*p == NULL){
return ;
}
free(*p);
*p = NULL;
}
int main(){
int * p ;
p = create();
delete(&p);
return 0;
}
全是自己一个个字敲的,对你有用的话,还希望采纳哦。
参考GPT和自己的思路:
是的,为了确保程序的安全性和可靠性,建议在释放完内存后将指针置为NULL,这可以避免悬空指针问题的出现。虽然在您的实现中,在delete函数中将指针置为NULL,但是在main中不会被同步更新,因此最好将指针在main中也置为NULL。
参考GPT和自己的思路:
是的,你需要将main中指针p置为NULL。虽然delete函数中置为NULL的指针p已经被释放,但是在delete函数外部的指针p仍然包含该地址,这被称为“悬空指针”。如果不将外部指针也置为NULL,将会导致程序在尝试访问该地址时出现未定义行为,甚至导致程序崩溃。所以,为了安全起见,一定要在释放堆空间之后,将指针置为NULL。
malloc对应free
new对应delete
不能混用