博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

网上抄的 内存泄漏

Posted on 2011-12-18 16:02  酸梅拯救地球  阅读(141)  评论(0)    收藏  举报

void GetMemory(char *p, int num)
{
      p = (char*)malloc(sizeof(char) * num);
}
void Main(void)
{
      char *str = NULL;
      GetMemory(str, 100);                 //其实这样出来的str还不为NULL
      strcpy(str, "Hello Word!");          //在运行时是错误的,这还会有一个问题“内存泄漏”,这个词大家肯定不陌生
}
      这是为什么呢!因为指针变量也是一样类型,而在GetMemory()参数传递时,只是把这个指针变量的值(地址)传递过去了。可以理解为指针 p 和 str指同一个地址空间,而我再对p开辟新的空间,只是把p的指向修改了,这样不是说str的指向也随着p的修改而修改,str的指向跟p没有任何关系。 所以str指向还是一个NULL空间,而在这个函调用完成以后*p就被释放,但是用malloc()函数开辟的空间是在堆存储空间,只能通过自己用 free()来进行释放,这样就造成了“内存泄漏”。
      这个问题有常用的两种解决方法:
方法一:
char* GetMemory(int num)
{
     char *p; 
     p = (char*)malloc(sizeof(char) * num);
     return p;
}
方法二:
void GetMemory(char **p, int num)
{
      *p = (char*)malloc(sizeof(char) * num);
}