考虑c代码:
void mycode() { MyType* p = malloc(sizeof(MyType)); /* set the values for p and do some stuff with it */ cleanup(p); } void cleanup(MyType* pointer) { free(pointer); pointer = NULL; }
我错了,认为清理后(p);被调用,p的内容现在应该是NULL吗?会清理(MyType *指针)是否正确释放内存分配?
我正在编码我的大学作业,并发现调试器仍然显示指针,以便我有一个内存地址而不是0x0(或NULL).
我在C中发现内存管理非常复杂(我希望不只是我).有什么可以照亮发生的事情吗?
解决方法
@H_502_13@ 是的,会正确释放内存.清理功能中的指针是局部变量;在本地存储的值传递给该函数的副本.
这可能会增加您的混淆,但您可以从mycode方法调整变量p的值,如下所示:
void cleanup(MyType** pointer) { free(*pointer); *pointer = NULL; }
在这种情况下,指针存储指针的地址.通过取消引用,您可以更改存储在该地址的值.
我会注意到,在软件的相同逻辑“级别”处理分配和释放通常是一个很好的做法 – 即不要让调用者有责任分配内存,然后将其释放到函数内.保持一致并处于同一水平.