【转载】 free(p)后指针问题

转载自:http://blog.csdn.net/onestep365/article/details/1897626

#include <stdio.h>
#include
<string.h>
#include
<stdlib.h>

int
main()
{
  char *str = (char
*)malloc(100);
  strcpy(str,
"hello");
  free(str);
  if(str !=
NULL)
   
{
      strcpy(str,
"world");
      printf("%s/n",
str);
   
}
      return
0;
}

最后还是会输出:world

free(str)后指针仍然指向原来的堆地址,即你仍然可以继续使用,但很危险,因为操作系统已经认为这块内存可以使用,他会毫不考虑的将他分配给其他程序,于是你下次使用的时候可能就已经被别的程序改掉了,这种情况就叫“野指针”,所以最好free()了以后再置空
str
=
NULL;
即本程序已经放弃再使用他。

下面是摘自论坛里面的形象比喻,加深理解。
  
 
CRT的内存管理模块是一个管家。   
  你的程序(简称“你”)是一个客人。
  
  管家有很对水桶,可以用来装水的。
  
  malloc的意思就是“管家,我要XX个水桶”。
  
 
管家首先看一下有没有足够的水桶给你,如果没有,那么告诉你不行。如果够,那么登记这些水桶已经被使用了,然后告诉你“拿去用吧”。
  
  free的意思就是说:“管家我用完了,还你!”。
  
  至于你是不是先把水倒干净才给管家,那么是自己的事情了。--是不是清零。
  
 
管家也不会将你归还的水桶倒倒干清(他有那么多水桶,每个归还都倒干净岂不累死了)。反正其他用的时候自己会处理的啦。
  
  free之后将指针清零只是提醒自己,这些水桶已经不是我的了,不要再完里面放水了,^_^
  
 
如果free了之后还用那个指针的话,就有可能管家已经将这些水桶给了其他人装饮料的了,你却往里面撒了泡尿。好的管家可能会对你的行为表示强烈的不满,
杀了你(非法操作)--这是最好的结果,你知道自己错了(有错就改嘛)。一些不好的管家可能忙不过来,有时候抓到你作坏事就惩罚你,有时候却不知道去那里
了--这是你的恶梦,不知道什么时候、怎么回事情自己就死了。不管怎么样,这种情况下很有可能有人要喝尿--不知道是你的老板还是你的客户了.^_^。
  
 
所以啊,好市民当然是还了给管家的东西就不要再占着啦,.^_^。

【转载】 free(p)后指针问题,布布扣,bubuko.com

时间: 2024-10-12 11:38:52

【转载】 free(p)后指针问题的相关文章

测试对象销毁后指针是否还可以使用

<span style="font-size:18px;">// 04-测试对象销毁后指针是否还可以使用 // // Created by wanghy on 15/8/13. // // //为了直观,直接将.m和.h文件写在main.m中. #import <Foundation/Foundation.h> //定义 person类 包含 姓名,年龄和性别 @interface person : NSObject { @public NSString * _

free 或delete后指针怎么样了

free()和delete()只是把指针所指向的内存释放掉,但是并没有把指针本身删除,也没有把指针置为NULL; #include<iostream> using namespace std; int main(void) { char *p=(char *)malloc(100*sizeof(int)); strcpy(p,"Hello World"); cout<<"释放前指针p的地址:"<<&p<<end

vector中insert/erase后指针失效问题

之前看<C++ Primier>的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究.今天写程序的时候遇到了这个问题. 1 小心冀冀地Erase 最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法 vector<int> a; for (int i = 0; i < 10; ++i) { a.push_back(i); } for (auto it = a.begin(); it != a.end();++it ){

为什么delete指针后指针设为null

int *p;/*........*/delete p; p=null; 看代码的过程中,有这么一个疑问.删除了指针p,指针p既是不存在,怎么还能设置指针p为null呢?为什么还要设置为null呢? 后来得知计算机上删除数据的方式:删除数据(视频,音乐,文件等),计算机并不会把存储数据的硬盘区域(或者是内存)的内容擦除消去,而是将内容标记为可覆盖,这时候我们就不能再访问到数据,而这些可覆盖据数据会留在原来的硬盘区域直到被新的数据逐渐覆盖.(所以,删除了数据之后,只要没有对硬盘进行过多的操作,还是

[转载]win7休眠后网络断开怎么办?如何设置?

http://jingyan.baidu.com/article/8065f87fc87d0423312498af.html 有时会遇到在Windows7系统休眠模式下会自动断开网络连接,唤醒系统也是无法连接,网络断开,怎么办呢?首先win7系统是没有问题的,其次在Windows7系统中也介绍过休眠模式在待机的状态下是不会断开网络的,下面教大家如何解决休眠后网络断开的问题. 方法/步骤 具体步骤如下:1,右键单击桌面上的“计算机”属性, 2,单击左侧的“设备管理器”: 3,点击网络适配器: 4,

offset 后 指针数组转换

AcDbObjectId pidoffset; AcDbPolyline *plineOffset; AcDbVoidPtrArray ptarr=NULL; pline->getOffsetCurves(dist, ptarr); int ilen = ptarr.length(); for (int i = 0; i < ilen; i++) { plineOffset = static_cast<AcDbPolyline*>(ptarr[i]); pidoffset = CD

指向指针的指针做函数的参数(转载)

一. 回顾指针概念:  今天我们又要学习一个叫做指向另一指针地址的指针.让我们先回顾一下指针的概念吧!  当我们程序如下申明变量:  short int i; char a; short int * pi; 程序会在内存某地址空间上为各变量开辟空间,如下图所示.  内存地址→6     7      8     9     10     11    12    13     14    15  ---------------------------------------------------

彻底搞定c指针系列--转载

<彻底搞定C指针>第一篇 变量的内存实质 要理解C指针,我认为一定要理解C中“变量”的存储实质,所以我就从“变量”这个东西开始讲起吧! 先来理解理解内存空间吧!请看下图: 内存地址→ 6 7 8 9 10 11 12 13 ----------------------------------------------------------------- ··· | | | | | | | |·· -------------------------------------------------

【C语言/C++】 指针总结

[本文原创于Silence?轩辕?寂的博客园技术博客.] [本文欢迎转载,转载请以链接形式注明出处.] [本博客所有文章都经博主精心整理,请尊重我的劳动成果.] [C语言]指针总结 一,指针的运算1,&和*运算符的优先级相同,且是自右向左结合的单目运算符也是自右向左结合的,故*p++和(*p)++是不一样的.而且*,++是具有相同的运算优先级的,故如*s++,++是作用于s的,而不是*s.2,两个指针有时候可以做减法运算,例如,若p,q指向同一数组中的元素,那么p-q表示的是p,q之间的元素的个