当前位置:  技术问答>linux和unix

C语言内存释放后的野指针

    来源: 互联网  发布时间:2017-04-08

    本文导语:  直奔主题:   代码大致逻辑如下:   1:先是申请了一块内存,给IP_head:      IP_head=(IP_HEAD *)calloc(1,sizeof(IP_HEAD));   2:然后把IP_head作为实参传给函数:      IPv4_dissect(IP_HEAD *ip_head);   3: 接着在函数里面...

直奔主题:
  代码大致逻辑如下:
  1:先是申请了一块内存,给IP_head:
     IP_head=(IP_HEAD *)calloc(1,sizeof(IP_HEAD));

  2:然后把IP_head作为实参传给函数:
     IPv4_dissect(IP_HEAD *ip_head);

  3: 接着在函数里面把IP_head指向的内存释放掉,并让IP_head指向NULL:
    free(IP_head);
    IP_head = NULL;
 
然后我的疑惑就产生在下面:
 在IPv4_dissect函数里面居然还能对参数ip_head操作:
 打印ip_head ->protocol
 居然还有意义,而且是正确的!
 这是为什么呢?

|
收回内存了,只要还没被分配或者修改,那他的值还在那。free之后不会把那快地址清0

|
此时你再这么搞只能是未定义的行为,程序可能工作,也可能crash

|


我觉得不是这样的吧。应该可以正常的使用!因为分配的那块内存free掉了,指针也指向的NULL。其它进程再分配 到这块内存的时候,就相当于给这块内存重新赋值。没有其它的什么影响!

|


正解,+1




不会被其他进程申请的,只可能会被该进程的其他线程申请。每个进程的堆空间是独立的。
如果有被其他线程重新申请到这块内存,并有写过,那你这时候 ip_head ->protocol 可能是修改后的值。
另外,C语言是值传递的,IPv4_dissect(IP_HEAD *ip_head) 函数里面的实参是IP_head的拷贝,在该函数内free掉并置为NULL,该函数外,IP_head还是指向分配的内存的地址的。

|
应该是吧。指向NULL了。


|
  3: 接着在函数里面把IP_head指向的内存释放掉,并让IP_head指向NULL:

这句话,在函数里把形参置为NULL??  形参的改变并不影响对应的实参

free内存一般情况并未被操作系统回收,只是libc里的内存管理着变为空闲的了,供下次分配用。所以并不会出现访问原来被释放的内存时并没出现SIGSEGV越界。
同时free也不会使内存被清0,因为那样开销太大。

|
谁分配内存就由谁释放,尽量不要写这种代码,因为C语言没有规定free后的内存块不允许访问,因为现代操作系统的内存保护多数是页级别的,无法对内存段做保护,尤其是多线程的情况下,这样随意修改内存很可能崩掉。

    
 
 

您可能感兴趣的文章:

  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • C语言指针问题?
  • C语言中常量指针与指针常量区别浅析
  • C语言:指针问题求救~
  • C语言的指针类型详细解析
  • 一个c语言指针问题
  • C语言指针学习经验总结浅谈
  • 关于c语言指针的两处小tip分享
  • C语言数组指针的小例子
  • C语言入门之指针用法教程
  • C语言创建链表错误之通过指针参数申请动态内存实例分析
  • 基于C语言中野指针的深入解析
  • C语言安全之数组长度与指针实例解析
  • 新手提问c语言指针
  • c语言指针之二级指针示例
  • 解析C语言中空指针、空指针常量、NULL & 0的详解
  • 关于C语言指针赋值的问题详解
  • 深入理解C语言 static、extern与指针函数
  • 深入分析C语言中结构体指针的定义与引用详解
  • C语言指针的长度和类型深入分析
  • 在Linux上用C语言编写的函数里面申请了一块内存,并且返回这块内存,最终它需要释放吗?
  • C语言 结构体动态数组内存释放问题
  • C语言中堆空间的生成与释放详解
  • C语言中多维数组的内存分配和释放(malloc与free)的方法
  • 在Linux上用C语言作了一个程序,程序中申请(malloc)了很大的内存,但是没free,当程序运行结束后,内存是否自动释放?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • C 语言内存错误检测工具 memwatch
  • 在语言中,什么是共享内存,怎样使用,举例?
  • C语言内存分配问题。
  • C语言内存泄漏检测工具 MemLeak
  • linux C语言 如何获取系统可用内存?
  • 现在我用c语言在linux下写一个服务端程序现发现了内存泄漏问题
  • C语言中各个段都在内存的什么地址范围?
  • 浅析C语言中的内存布局
  • C/C++语言中结构体的内存分配小例子
  • 笔试遇到内存操作思考题,C语言
  • C语言中的内存泄露 怎样避免与检测
  • 解析C语言中位字段内存分配的问题
  • 怎么将这段JAVA代码换成C语言,实现同样的功能,就是查看进程内存?
  • 深入C语言内存区域分配(进程的各个段)详解
  • c语言内存泄露示例解析
  • C语言内存对齐实例详解
  • 深入探讨C语言中局部变量与全局变量在内存中的存放位置
  • C语言、C++内存对齐问题详解
  • 深入理解C语言内存对齐
  • 2013年7月和2013年8月编程语言排行榜
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • C语言中间语言 CIL
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 最近学JSP,苦于HTML语言和JAVA语言太差,请教推荐几本书,thanks.
  • PHP编程语言介绍及安装测试方法
  • 动态编程语言 LIME编程语言
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,