指针free后还存在吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针free后还存在吗?相关的知识,希望对你有一定的参考价值。

存在
free 0释放的是指针指向的内存。
指针是一个变量,只有程序结束时才被销毁。
释放了内存空间后,原来指向这块空间的指针还存在,只不过现在指针指向的内容是无用的,
未定义的。
因此,释放内存后把指针指向NULL,
防止指针在后面不小心又被引用。
参考技术A 指针还在,只是它所指的内容给释放了,变成了野指针,此时不能再对它做解引用,若需要使用该指针可以给它重新分配内存。还有,指针free后,最好将它赋为NULL 参考技术B 看free的实现过程了,如果free释放内存后, 并将指针指向NULL了,指针就不存了,如果仅仅是释放内存,则还会存在。 为了保险,建议自己调用free后,再将其指向NULL。 特别是对全局的指针变量的操作。 参考技术C 存在,只是为其分配的内存释放掉了。此时它的值为NULL 参考技术D free后指针指向空间的存储被释放了,
但是指针所指向的地址并没有改变,你还可以向那个地址写内容。
为了避免误操作的情况,通常我们在free了那块内存地址之后,再将指针指向空
这样可以充分避免误操作

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

【中文标题】在 C 中正确使用 free() 函数【英文标题】:Correct usage of free() function in C 【发布时间】:2015-06-09 07:09:20 【问题描述】:

我是 C 编程语言的新手,你能告诉我这是否正确吗?

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

【问题讨论】:

如果你给free的指针不是malloc/calloc/realloc返回的指针,那么代码会出现未定义行为 【参考方案1】:

您应该在由malloccallocrealloc 返回的分配内存的指针上调用free。

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

注意事项:

永远不要释放内存两次。例如,如果您在ptr 上调用free 两次并且ptr 的值自第一次调用free 以来没有更改,则可能会发生这种情况。或者你有两个(或更多)不同的指针指向同一个内存:如果你在一个上调用 free,你现在也不能在其他指针上调用 free

当你释放一个指针时,你甚至不能read它的值;例如,if (ptr) 在释放后不允许使用,除非您将 ptr 初始化为新值

你不应该取消引用释放的指针

将空指针传递给free 可以,不执行任何操作。

【讨论】:

【参考方案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

【讨论】:

【参考方案3】:

free() 函数用于释放一个程序使用的内存并将其移回可用内存区域,以便其他操作系统进程可以使用该内存位置。此外,free 函数采用指向该内存位置的任何类型的指针。 例如:

int a = 10;  // suppose 2 byte is allocated ie location 1000 and 1001

现在这2个字节的内存属于特定问题;因此操作系统不会将此内存位置提供给另一个进程(内存现在分配的内存不可用内存)

 int *ptr =&a;
 /*ptr is pointer variable pointing to 1000  
 as it is int pointer therefore ptr++ will move pointer to 1002*/

现在如果我们执行free(ptr),它将检查指针类型并根据类型释放函数释放内存,在这种情况下从 1000 开始分配 2 个字节。

现在有趣的一点是,在操作系统将此内存分配给其他进程并且该进程将其覆盖之前,您的数据将一直存在。

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

*ptr 可能会或可能不会给出相同的值,因此最好设为ptr =null

【讨论】:

【参考方案4】:

来自free()函数的man page:

free() 函数释放指针 ptr 指向的内存空间,该指针必须由 pre- 返回 强烈致电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.

【讨论】:

会导致空间内存安全或时间内存安全错误吗? ...什么? char c = malloc(100)上分配100个字节,将指针转换为char,然后存储到c。调用free(c) 会将c(一个字符)转换为一个指针,然后尝试释放它,这将导致系统崩溃,因为(大部分时间)将一个指针转换为char 并返回会改变它的值并使其成为无效指针。

以上是关于指针free后还存在吗?的主要内容,如果未能解决你的问题,请参考以下文章

对 NULL 指针连续 free多次会出错吗?为啥?

字符指针用free释放后,需要设置null吗?

matlab gui界面激活后还能修改吗?

free()的释放是何涵义,是把内容清空还是把指针置为NULL啊,还是其他啥啊。。求指点啊。。

在 free() 之后将指针设置为 NULL 总是一个好习惯吗? [复制]

如何使selectpicker下拉框添加的值在刷新页面后还存在