使用free或delete之后,只是把指针所指的内容给释放掉,但是指针并没有被干掉,还是指向原来位置(并不是执行NULL),此时指针指向的内容为垃圾,被称为“野指针”。

举例说明几个重要容易迷糊的特征:

1. 指针消亡了,并不表示他所指向的内存会被自动释放。例:

void func(coid)
{
char *p = (char *)malloc(sizeof(char) * );
}

当函数执行完时,指针变量因为存在于栈上,会自动消亡。但是这不意味着分配的空间也会自动释放,原因是:动态非配的空间位于堆(动态内存分配区),必须自己去释放;否则,调用一次函数,造成一次内存泄露。

2. 内存被释放了,并不表示指针会自动消亡或变成NULL指针。例如

char *p = (char *)malloc(sizeof(char) * );
cout << &p << endl;
free p;
cout << &p << endl;

可以看出两次输出是一样的,也就是说虽然内容被释放掉了。但是指针还是指向原地。因此释放掉指针后,应该立马赋值为NULL。

杜绝“野指针”

  • 指针变量要初始化。要么为NULL,要么为合法的内存
  • 指针被释放掉时,将指针置位NULL
  • 防止指针超越了变量的作用范围。例:
    for(int i=; i<; ++i)
{
p = &i;
}
cout << *p << endl;
cout << i << endl;

free 和 delete 把指针怎么了的更多相关文章

  1. free 或delete后指针怎么样了

    free()和delete()只是把指针所指向的内存释放掉,但是并没有把指针本身删除,也没有把指针置为NULL; #include<iostream> using namespace st ...

  2. 不要轻易delete void*指针,这样会隐藏比较多的错误。

    #include<iostream> using namespace std; class Object{ void* data; const int size; const char i ...

  3. 【转】为什么delete以后指针还能被赋值

    首先,系统知道哪一部分堆的线性空间被占掉了,new就是起这个作用,仅仅是声明一下(可能多了一个功能),因为堆的空间不一定是直接从系统调用获得的,堆的空间是这样管理的:程序先伸请一个大的堆空间,这个时候 ...

  4. free 和delete 把指针怎么啦?

    别看 free 和 delete 的名字恶狠狠的(尤其是 delete),它们只是把指针所指的内存给 释放掉,但并没有把指针本身干掉. 发现指针 p 被 free 以后其地址仍然不变(非 NULL), ...

  5. free和delete把指针怎么啦?

    别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉. 用调试器跟踪示例7-5,发现指针p被free以后其地址仍然不变(非NULL) ...

  6. delete 删除指针

    危险的代码: int* p=new int(1);   delete p;   delete p; 安全的代码: int* p=new int(1);   delete p;   p = NULL; ...

  7. 迷途指针 new delete

    编程中有一种很难发现的错误是迷途指针.迷途指针也叫悬浮指针.失控指针,是党对一个指针进行delete操作后——这样会释放它所指向的内存——并没有把它设置为空时产生的.而后,如果你没有重新赋值就试图再次 ...

  8. delete指针以后应赋值为NULL

    delete p后,只是释放了指针中存放的地址中的内存空间.但是指针变量p仍然存在(即指针p本身所占有的内存),且p中存放的地址还是原来的地址. 例如: 对一个非空指针delete后,若没有将p赋为N ...

  9. delete指针以后应赋值为NULL——QT deletelater指针以后也同样要马上赋值为NULL

    delete p后,只是释放了指针指向的内存空间.p并不会自动被置为NULL,而且指针还在,同时还指向了之前的地址 delete NULL编译器不会报错(因为delete空指针是合法的) 例: 对一个 ...

随机推荐

  1. 搬家至独立博客 https://www.imzjy.com/blog/

    欢迎访问 https://www.imzjy.com/blog/

  2. DataTable转List<T>

    /// <summary> /// DataTable转List<T> /// </summary> public static class TableToList ...

  3. maven多模块启动required a bean of type com.xxx.xxx.service that could not be found.

    Description: Field testService in com.xxx.xxx.api.controller.TestController required a bean of type ...

  4. Jmeter+Ant生成结果报告时,MinTime、MaxTime显示NaN的问题

    将apache-jmeter-2.13\lib中的serializer-2.7.2.jar.xalan-2.7.2.jar复制到apache-ant-1.9.6\lib中即可: 复制前生成:

  5. Javascript 535种方式!!!实现页面重载

    原文地址: http://www.phpied.com/files/location-location/location-location.html 完全出于好玩,竟然有人整理了500多种方法来实现刷 ...

  6. HBase – 探索HFile索引机制

    本文由  网易云发布. 作者: 范欣欣 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 01 HFile索引结构解析 HFile中索引结构根据索引层级的不同分为两种:single-level和m ...

  7. 八.linux系统文件属性知识

    1.文件属性权限是12位,现在只看9位,其中每3个一组,为:属主权限.属组权限.其他权限,其中r可读,w可写,x可执行,如图: 2.文件属性之软硬链接   linux系统中有两种链接,为硬链接(ln) ...

  8. 546. Remove Boxes

    Given several boxes with different colors represented by different positive numbers. You may experie ...

  9. java中-的流-与操作

    /* 字节输出流  OutputStrema:     * OutputStream抽象类     * write(int b); 将指定的字节写入此流中     * write(byte[] b); ...

  10. ROS(URDF机器人建模)

    新建功能包mbot_description 在功能包下新建文件config,launch,meshes,urdf. 在launch文件夹下新建文件display_mbot_base_urdf.laun ...