返回信息流很多情况都是在一个函数中 malloc 了一段内存,然后返回地址,在后面 free。
如果是 malloc 某种类型的单个元素,
比如 char* p = (char*)malloc(sizeof(char)),那么在其他函数作用域中free的由于地址是char的指针,所以可以正确释放掉。但要是分配了一个数组空间呢?
换句话说,用另一个指针去接返回地址的时候,它只知道位置信息,又如何知道 p 指向的内存空间的大小信息呢?
这是一条镜像帖。来源:北邮人论坛 / soft-design / #21622同步于 2007/10/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
malloc数组,在其他函数中free会内存泄露?
ericyosho
2007/10/9镜像同步20 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
首先malloc的内存分配是在堆(heap)上完成的。。。而且一般分配在默认堆上。。。
以win32为例
malloc调用的API为HeapAlloc
free调用的API为HeapFree
HeapFree的的参数中也是不需要空间大小的。。。这个计数由OS来完成。
另外win32的crt还提供了一个_msize函数。。。可以返回对应指针分配的内存大小。。。
它调用的API是HeapSize
另外。。。Heap的默认大小是1M。。。虽然可以由系统调整大小。。。但是从安全和效率的角度考虑。。。在win32下需要分配大于1M的内存。。。还是使用VirtualAlloc比较好。。。
加m吧,哈哈
【 在 CNLAS (Ich gewinne bestimmt……) 的大作中提到: 】
: 首先malloc的内存分配是在堆(heap)上完成的。。。而且一般分配在默认堆上。。。
: 以win32为例
: malloc调用的API为HeapAlloc
: ...................
如果只是临时用的内存,又不是特别多,还有 alloca 可以用。它在栈上分配内存,也不用释放。只是用 alloca 在一个函数里分配的内存只能在这个函数里使用,函数返回了就失效了(分配的内存自动释放)。
没必要用malloc去分配某个类型的数组吧
【 在 ericyosho 的大作中提到: 】
: 很多情况都是在一个函数中 malloc 了一段内存,然后返回地址,在后面 free。
: 如果是 malloc 某种类型的单个元素,
: 比如 char* p = (char*)malloc(sizeof(char)),那么在其他函数作用域中free的由于地址是char的指针,所以可以正确释放掉。但要是分配了一个数组空间呢?
: ...................
CNLAS说系统会管理的么?
试了一下,好像赋值给新的同种指针以后,并不能正确表示大小。
下面的程序,使用 splint 进行了检查,报告存在内存溢出。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
static char *dothings ( void )
{
char * a = ( char * ) malloc ( (size_t)60 );
assert ( a != NULL );
return a;
}
int main ( void )
{
char *b = dothings ( );
char *d = NULL;
assert ( b != NULL );
d = b++;
free ( d );
return 0;
}
呵呵,我没理解清楚你的意思
一般动态分配数组都是malloc(sizeof(type)*num)这种形式吧
【 在 ericyosho 的大作中提到: 】
: 为什么没有必要呢?感觉很有必要啊,要动态地处理大小不一的数据,肯定会用到指针数组啊。或者是malloc数组来放字符串。