我有一个看起来像这样的c函数
void fn(void *data) {
type *p=malloc(sizeof *p);
p=data;
...
free(p);
}
如果我理解正确,那么这两个问题就是malloc
为 p 留出了一些记忆,但 p 中的指针会立即生效指针数据覆盖,因此没有任何内容指向分配给 p 的内存。此外,后续的free
实际上释放了数据的内存,因此任何名为 fn 的函数都将无法再安全地访问它。这是对的吗?
我可能打算做的是:
void fn(void *data) {
type *p;
p=data;
...
}
由于没有malloc
没有free
,数据中的指针继续指向已分配的内存?
编辑:我应该指出,我确信数据中的指针实际上是与 p 相同类型的指针。
进一步编辑:数据中的指针指向其他地方的malloc<
答案 0 :(得分:3)
是。你明白了。在将内存分配给data
后将p
分配给p
将不会在malloc
之前留下指向已分配内存的指针。
一个程序不再可访问的内存块被称为 garbage 。留下垃圾的程序有内存泄漏
不幸的是,与其他一些语言不同,C没有垃圾收集器。
另一件事是调用 free(p)
将调用未定义的行为,因为free
的参数必须是以前由内存返回的指针分配函数(或者它可以是NULL
指针)。
答案 1 :(得分:2)
是的,该函数不应释放它未分配的内存。在大多数情况下值得遵循的原则是:不要在不同的环境中分配和解除分配。