读书人

free()也许delete到底对指针和内存做了

发布时间: 2013-07-11 15:38:46 作者: rapoo

free()或者delete到底对指针和内存做了什么?
1.free掉的指针被叫做野指针,这样堆空间里对应的位置全部归还给了操作系统?
2.这样一个例子:


char *p=(char *)malloc(sizeof(char)*100);
strcpy(p,"how's it going? \n");
free(p);

q1:free掉以后,这个p!=NULL不会为空,还是指向对应的内存,还是乱指?
q2:free以后,对应内存里的东西会不会变化,是全置0还是随机变化?
内存 指针 C 操作系统
[解决办法]
进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。
当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些
),然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点),并将可用
内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你
是可以继续访问这块地址的
[解决办法]
引用:
1.free掉的指针被叫做野指针,这样堆空间里对应的位置全部归还给了操作系统?
2.这样一个例子:

char *p=(char *)malloc(sizeof(char)*100);
strcpy(p,"how's it going? \n");
free(p);

q1:free掉以后,这个p!=NULL不会为空,还是指向对应的内存,还是乱指?
q2:free以后,对应内存里的东西会不会变化,是全置0还是随机变化?

1.基本上可以这样认为
2.free不会修改指针的值,p还是指向原来的地方,只不过那块内存已经释放了,再使用会发生什么谁也不知道



引用:
还有一个疑问:例如:

void test_free(void)
{
char *p=(char *)malloc(sizeof(char)*10);
//other codes;
}


1.这样当调用函数结束过后,指针已经死了(被销毁了),那么这部分内存是否发生了变化?
2.这部分内存是否还给了操作系统?
3.这部分内存能不能分配给其他变量?

1.如果你没有free,这块内存还是会保持原样,也不会被释放
这就是内存泄露
2.没有
3.不能

碰到内存泄露,除非程序结束,否则这块内存是再也无法重新被利用的。程序结束后操作系统会回收所有内存
[解决办法]
笔误, 是运算符
引用:
delete是操作符 被重载了的 它里面调用了free()和其它东西

[解决办法]
我一般是free后 p=NULL; 这样表示这个指针指向的内存没有分配.
p不管free不free都可以赋值,它就是一个变量.malloc可以给他赋值,那么其他方式也可以.
引用:
看,free掉的指针变量竟然还可以赋值:


(gdb) list
1#include<stdio.h>


2#include<stdlib.h>
3#include<string.h>
4
5int main(void)
6{
7char *p=(char *)malloc(sizeof(char)*100);
8strcpy(p,"hello");
9 free(p);
10strcpy(p,"why?");
(gdb) b 9
Breakpoint 1 at 0x8048442: file m.c, line 9.
(gdb) r
Starting program: /home/add1/Desktop/memory/m

Breakpoint 1, main () at m.c:9
9 free(p);
(gdb) print p
$1 = 0x804b008 "hello"
(gdb) n
10strcpy(p,"why?");
(gdb) print p
$2 = 0x804b008 "hello"
(gdb) n
11return 0;
(gdb) print p
$3 = 0x804b008 "why?"


[解决办法]
标记为可重新分配
delete还要先调用析构函数
[解决办法]
引用:
Quote: 引用:

要满足好奇心, 就看它的源代码

我只知道在vc里可以一点就看得到库函数,但是在linux下怎么看就不知道了~~求教~


我一般是把源代码下载到 Windows 上用 source insight 看. Linux 下的 IDE 不熟悉.
[解决办法]
引用:
Quote: 引用:

你可以在linux上测试一下到底出了什么情况。比如你的代码后面free掉以后,你在输出一下p的地址试试什么结果,你再写上p〔0〕或者把p当做字符串格式输出看看出来什么结果。这样你就知道了free后那一段内存空间有没有清零。有一点就是free了之后被操作系统重新利用这点是确实的,不然那还什么叫做内存管理呢?同时,你可以再试试再在代码后面加上一些代码看看操作系统对于回收后的内存空间怎么处理。比如你可以再定义一个指针q,申请的内存空间长度和指针p一样长,里面装的内容也是一样,看看q的地址是多少,然后又测试里面装不同的字符串指针又是什么地址,这样一步一步对比下去保持一个不同其他因素相同,然后就可以得出结果。我手机上打字躺床上不好起床帮你编好代码给你结果,你自己动手试试。
你这种思路很容易变成写出依赖编译环境的的代码
每个编译器的行为不一定一样的

那应该怎么自己动手得到自己想要的答案呢?求指教
[解决办法]
请阅读
http://blog.csdn.net/ma52103231/article/details/8542754

读书人网 >C语言

热点推荐