zoukankan      html  css  js  c++  java
  • 内存管理(——高质量程序设计语言C/C++第16章)

    内存的分配方式:

        1.静态存储区分配:全局变量,static变量等,在程序编译时已经分配了存储内存,在程序运行的整个期间一直存在

        2.程序的堆栈上:程序的局部变量,包括程序的形参等,只存在于程序的运行期间

        3在堆heap上分配的:动态内存分配,malloc或者new

    常见的内存错误:

    (1)内存分配未成功,却使用它了。记得malloc时要判断返回的是否是NULL,若为NULL则说明动态分配内存失败

    (2)内存分配成功了要记得初始化,malloc完了

        calloc :(元素个数,元素大小),calloc在分配完内存后会初始化为0

        realloc:(指针,新的大小),修改已经分配过的内存的大小,扩大或者缩小,若是扩大会在后面添加,不会改变原来的数据

        malloc:(字节大小),不会自己进行初始化

    (3)内存分配成功了,但在访问时越界了,超出了分配的内存的大小

    (4)忘记释放掉动态分配的内存,或者只是释放了一部分,这样函数每调用一次都会丢失一次内存,会内存泄露,最后程序崩溃

    (5)已经将内存给free掉了,但是没有把指针指向NULL,变成了野指针,还在使用它,会出现不可预料的情况。

    指针的参数是如何传递的

    (1)不要把函数的参数为指针的作为开辟动态内存的指针

        例如: void getmemory(int* ptr)

                          { ptr=(int*)malloc(sizeof(int)*10);}

    在这里当调用这个函数时,传入的实参时,拷贝一个指针变量ptr的值,给他,然后在函数内开辟内存时,相当于改变这个实参的值(即地址)

    对于形参时没有变化了。

    这里可以使用指向指针的指针或者指针的引用。

    函数的return时不要返回“栈内指针”,即返回指向在程序堆栈上分配的内存,当返回时,内存被释放了,所以没有任何意义。

  • 相关阅读:
    react 入坑笔记(五)
    练习
    高级指令
    进阶指令
    基础指令
    VMware 备份操作系统
    Ubuntu 用户的切换
    形态学转换
    图像模糊
    域名拆分 tld
  • 原文地址:https://www.cnblogs.com/yanliang12138/p/4681248.html
Copyright © 2011-2022 走看看