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.基本上可以这样认为
2.free不会修改指针的值,p还是指向原来的地方,只不过那块内存已经释放了,再使用会发生什么谁也不知道
1.如果你没有free,这块内存还是会保持原样,也不会被释放
这就是内存泄露
2.没有
3.不能
碰到内存泄露,除非程序结束,否则这块内存是再也无法重新被利用的。程序结束后操作系统会回收所有内存
[解决办法]
笔误, 是运算符
[解决办法]
我一般是free后 p=NULL; 这样表示这个指针指向的内存没有分配.
p不管free不free都可以赋值,它就是一个变量.malloc可以给他赋值,那么其他方式也可以.
[解决办法]
标记为可重新分配
delete还要先调用析构函数
[解决办法]
我一般是把源代码下载到 Windows 上用 source insight 看. Linux 下的 IDE 不熟悉.
[解决办法]
你这种思路很容易变成写出依赖编译环境的的代码
你可以在linux上测试一下到底出了什么情况。比如你的代码后面free掉以后,你在输出一下p的地址试试什么结果,你再写上p〔0〕或者把p当做字符串格式输出看看出来什么结果。这样你就知道了free后那一段内存空间有没有清零。有一点就是free了之后被操作系统重新利用这点是确实的,不然那还什么叫做内存管理呢?同时,你可以再试试再在代码后面加上一些代码看看操作系统对于回收后的内存空间怎么处理。比如你可以再定义一个指针q,申请的内存空间长度和指针p一样长,里面装的内容也是一样,看看q的地址是多少,然后又测试里面装不同的字符串指针又是什么地址,这样一步一步对比下去保持一个不同其他因素相同,然后就可以得出结果。我手机上打字躺床上不好起床帮你编好代码给你结果,你自己动手试试。
每个编译器的行为不一定一样的
那应该怎么自己动手得到自己想要的答案呢?求指教
[解决办法]
请阅读
http://blog.csdn.net/ma52103231/article/details/8542754