[自用5.]C++动态内存的分配、使用和释放

 new和delete

 new和delete是运算符,不是函数,因此运行效率比较高

为了与C语言兼容,C++仍保留了malloc和free,但是建议使用new和delete

new运算符

使用方法:

指针变量 = new 类型(常量);
指针变量 = new 类型[表达式]; //数组
指针变量 = new 类型[表达式][表达式]; //二维数组

 作用:从堆上分配一块“类型”指定大小的存储空间,返回首地址

其中,常量是初始化的值,可以省略,创建数组对象时,不能为对象指定初始值

delete运算符 

普通类型(非数据):delete 指针变量

数组:delete[] 指针变量 

#include 
#include 
using namespace std;

int main(void) {
    //分配基础类型
    //第一种分配动态内存不执行初始化
    int *p1 = new int;
    *p1 = 100;
    //第二种分配动态内存同时执行初始化
    int *p2 = new int(100);
    // 第三种 malloc 返回值是 void *
    int *p3 = (int *)malloc(sizeof(int));
    free(p1); //基础类型可以 new free 可以混搭
    delete p3; //基础类型可以 malloc delete 可以混搭
    delete p2; //free(p2); 同样效果

    //分配数组变量
    int *b1 = (int *) malloc(sizeof(int)*10);
    //p[0] - p[9] *(p+9)
    int *b2 = new int[10];
    delete b1; // free(p1); 可以混搭
    //free(p2); //可以混搭
    delete[] b2;

    system("pause");
    return 0;
}

 内存泄漏

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

 

因此,申请的内存用完一定要释放

存储类型 

 自动变量(auto)、静态变量 (static)、外部变量(extern) 以及寄存器变量(register)

 auto - 函数中所有的非静态局部变量。比如,程序中的 int a,b,c;    int i=0; 等变量

register - 一般经常被使用的的变量(如某一变量需要计算几千次)可以设置成寄存器变量,register 变量会被存储在寄存器中,计算速度远快于存在内存中的非 register 变量。
static - 在变量前加上 static 关键字的变量。
extern - 把全局变量在其他源文件中声明成 extern 变量,可以扩展该全局变量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展。
注意: C++ 的 register 关键字已经优化,如果我们打印它的地址,它就变成了 普通的 auto 变量

 

变量作用域和生存周期 

可以返回函数内部的地址:
动态分配的内存地址
局部静态变量的地址
全局静态变量和外部变量的地址

 

你可能感兴趣的:(C++,学习笔记,c++,开发语言)