C++程序的内存分区,使用动态内存动态内存分配、释放

这里写目录标题

    • 为什么要使用动态内存
      • 动态内存的分配、使用、释放
        • C++程序员的噩梦-内存泄漏
      • 变量的作用域和生存周期
        • 常见错误总结

为什么要使用动态内存

1.按需分配,根据需要分配内存,不浪费

new 分配内存布局图
C++程序的内存分区,使用动态内存动态内存分配、释放_第1张图片
2. 被调用函数之外需要使用被调用函数内部的指针对有应的地址空间

C 内存分配:
void *malloc(size_t size);
void free(void *);
malloc 在内存的动态存储区中分配一块长度为 size 字节的连续区域返回该区域 的首地址.

3.突破栈区的限制,可以给程序分配更多的内存

动态内存的分配、使用、释放

new 和 delete 基本语法

  1. 在软件项目开发过程中,我们经常需要动态地分配和撤销内存空间,特 别是数据结构中结点的插入与删除。在 C 语言中是利用库函数 malloc 和 free 来 分配和撤销内存空间的。C++提供了较简便而功能较强的运算符 new 和 delete 来 取代 malloc 和 free 函数。 (注意: new 和 delete 是运算符,不是函数,因此执行效率高。)

  2. 虽然为了与 C 语言兼容,C++仍保留 malloc 和 free 函数,但建议用户不 用 malloc 和 free 函数,而用 new 和 delete 运算符。

  3. new 运算符的例子:
    new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)
    new int(10); //开辟一个存放整数的空间,并指定该整数的初值为 10,返回一个指向该存 储空间的地址
    new char[100]; //开辟一个存放字符数组(包括 100 个元素)的空间,返回首元素的地址 new int[5][4]; //开辟一个存放二维整型数组(大小为 5*4)的空间,返回首元素的地址
    float *p=new float (3.14159); //开辟一个存放单精度数的空间,并指定该实数的 初值为//3.14159,将返回的该空间的地址赋给指针变量 p

  4. new 和 delete 运算符使用的一般格式为:
    C++程序的内存分区,使用动态内存动态内存分配、释放_第2张图片

C++程序员的噩梦-内存泄漏

  1. 内存泄漏(Memory Leak) - 是指程序中己动态分配的堆内存由于某种原因程序未释放或 无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

  2. 变量的 4 种存储类型
    所有的数据都有两种类型 数据类型: 如 int,float 等

  3. 存储类型: 总共有四种存储类型的变量,分别为自动变量(auto)、静态变量 (static)、外部变量(extern)以及寄存器变量(register)。

  4. auto - 函数中所有的非静态局部变量。

  5. register - 一般经常被使用的的变量(如某一变量需要计算几千次)可以设 置成寄存器变量,register 变量会被存储在寄存器中,计算速度远快于存在内存 中的非 register 变量。

  6. static - 在变量前加上 static 关键字的变量。

  7. extern - 把全局变量在其他源文件中声明成 extern 变量,可以扩展该全局变 量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展。

变量的作用域和生存周期

C++程序的内存分区,使用动态内存动态内存分配、释放_第3张图片

  1. 函数返回值使用指针
    可以返回函数内部:动态分配内存地址 局部静态变量地址 以及全局静态变量和外部变量 地址

常见错误总结

  1. 申请的内存多次释放
  2. 内存泄漏
  3. 释放的内存不是申请时的地址
  4. 释放空指针
  5. 释放一个内存块,但继续引用其中的内容
  6. 越界访问

C++程序的内存分区,使用动态内存动态内存分配、释放_第4张图片

一年入门,三年入行,五年入道,七年入定,十年入化

你可能感兴趣的:(C++,c++,指针,内存管理,malloc)