zoukankan      html  css  js  c++  java
  • C\C++中内存管理问题

    使用未初始化的内存:程序中不同变量的默认初始化方式也不同,对于全局,Static变量的初始值为,而临时变量和动态分配变量的初始值为随机数,使用随机数可能会导致无法预期的错误。

    内存读写越界:比如访问数组越界,访问动态分配内存大小范围外的内存,这样可能会导致非法访问,或者是无意修改其他内存空间的数据,造成运行时错误。后果很严重。

    内存覆盖:常见的C语言内存操作函数 strcpy, strncpy, memcpy, strcat,可以直接对内存操作,如果大小控制不好的话,很可能会导致覆盖掉非预期的内存空间的数据。缓冲区      溢出漏洞往往正是利用这点,后续日志中,我会详细介绍缓冲区溢出的原理,漏洞的探测和利用,以及从编码级别上的一些防护。

    动态内存管理错误:常见的内存分配有三种,分为静态,栈上分配,堆上分配。静态分配即在编译是就被分配了空间,比如已初始化的变量一般放在ELF文件的.data段,不过在运行时还是保存在栈中。未初始化的全局变量,在ELF文件中仅仅是个.bss段的占位符(ELF文件格式,相关工具后续日志中汇相继介绍)。函数的局部变量属于栈上分配,大小视变量类型。比较灵活的内存分配方法属于堆上分配,常见的函数malloc, alloc, realloc, new等,动态释放函数包括free, delete。这里面需要注意的是动态内存管理师需要用户自己来管理,常见的内存动态管理错误有:

      • 申请和释放不一致:C++和C语言中的内存分配和释放函数不能混用。
      • 申请和释放不匹配:申请多少内存,用完后要释放掉,少释放容易导致内存泄露多释放也会产生问题(什么问题)。
      • 读写以释放的内存

        内存泄露:什么事内存泄露?内存泄露指的是,在程序中动态申请的内存,在使用完后既没有释放,又无法被程序的其他部分访问。

  • 相关阅读:
    到达波密
    福建
    到达拉萨
    樟木半天游
    修改控制寄存器GPBCON
    WINCE实现屏幕旋转的方法
    6410主频
    如何解决触摸屏抖动问题
    视频格式D1
    安家了
  • 原文地址:https://www.cnblogs.com/xddy/p/2193254.html
Copyright © 2011-2022 走看看