正确使用C中的free()函数

时间:2015-04-04 09:49:14

标签: c pointers buffer free

我是C编程语言的新手,所以你能告诉我这是否是正确的方法。

例如: 缓冲区上的程序点,我在pointer函数中使用free()作为参数。那么,这个功能会导致什么问题呢?

4 个答案:

答案 0 :(得分:6)

您可以免费拨打指针,这些指针已分配给malloc/calloc/realloc 仅返回的内存。

E.g。

char* ptr=malloc(10); 

// use memory pointed by ptr 
// e.g., strcpy(ptr,"hello");

free(ptr); // free memory pointed by ptr when you don't need it anymore

要记住的事情:

  1. 永远不要释放内存两次。这可以做到:(1)如果您在free上拨打ptr两次,ptr的值自第一次拨打free后未被更改(2)您有两个不同的指针指向相同的内存;如果你在一个上免费拨打电话,你现在也不能在第二个指针上拨打free

  2. 当你释放指针时,你甚至不允许读取它的值;例如,除非您将if (ptr)初始化为新值

  3. ,否则在释放后不允许ptr
  4. 当然你也不应该取消引用释放的指针

  5. 正如@chqrlie所指出的那样,我还要在这里添加一个空指针传递给free也完全没问题,这只会做什么然后

答案 1 :(得分:2)

认为计算机有一大堆内存尚未被您的程序使用。现在你需要更多内存,并要求你的计算机再给你一些(例如,一个大缓冲区)。完成后,您需要将其返回计算机。

此内存称为堆。您通过致电malloc()询问记忆,并通过致电free();

返回
char *buffer;
buffer = malloc(512);           // ask for 512 bytes of memory
if (buffer==NULL) return -1;   // if no more memory available
...
free(buffer);                 // return the memory again

答案 2 :(得分:0)

Free()函数用于释放一个程序使用的内存,并将其移回可用内存区域,以便其他操作系统进程可以使用该内存位置。自由函数还可以使用指向该内存位置的任何类型的指针。 例如  整数= 10; //假设分配了2个字节,即位置1000和1001   现在这2个字节的内存属于特定问题,因此O.S 不会将此内存位置分配给另一个进程(现在为内存分配的内存不再是可用内存)  Int * ptr =&a; // ptr是指向1000的指针变量,因为它是int指针,所以ptr ++会将指针移到1002

现在,如果我们免费(ptr) 它将检查指针类型,并根据类型自由函数在这种情况下释放内存,从1000开始2字节 现在有趣的一点是,您的数据将一直保留到它们。OS将该内存分配给其他进程,然后该进程覆盖它。

即使在free()函数之后,ptr仍指向1000,但是该内存位置不属于我们的程序,因此ptr指针具有新的名称DANGLING POINTER。

* ptr可能会或可能不会提供相同的值,因此最好使ptr = null。

答案 3 :(得分:-1)

来自free()函数的man page

  

free()函数释放指针ptr指向的内存空间,该内存空间必须由预先返回          好意打电话给malloc()calloc()realloc()。否则,或者已经调用了free(ptr)          之前,发生未定义的行为。如果ptrNULL,则不执行任何操作。

在动态分配内存时,必须使用free()函数。

如果您将其用作静态变量,则可能会导致意外行为。


 char *c=malloc(100);//allocating the 100 bytes of memory for a pointer variable c.

在使用该变量后,您可以释放分配的内存,

 free(c);

如果你被声明为这样的变量,

char c= malloc(100);// It is illegeal. And c will have a memory in stack.

如果您释放此变量,

free(c);//it will lead to system crash. Because your freeing the memory which is in  stack memory.