• 【C++】动态内存管理 ② ( new 运算符 为 基础数据类型 / 基础数据数组类型 分配堆内存 )






    一、C++ 对象的动态创建和释放



    动态内存管理 在 C++ 语言中 , 就是通过 new 和 delete 运算符 进行对象的 创建 与 释放 ;

    • 通过 new 运算符 创建对象 , new 运算符 相当于 C 语言中的 malloc / calloc / realloc 等 申请内存的 标准库函数 ;
    • 通过 delete 运算符 释放对象 , delete 运算符 相当于 C 语言中的 free 释放内存的 标准库函数 ;

    在 C++ 语言中 , 为了兼容 C 语言 , 仍然可以使用 malloc 和 free 函数动态管理内存 ,

    但是 更建议 开发者在 C++ 程序开发时 , 使用 new 和 delete 运算符 进行 动态内存的管理 ;

    不建议在 C++ 中使用 malloc 和 free 进行动态内存管理 ;


    使用 new 和 delete 运算符 可以为如下类型的变量 动态分配内存 :

    • 类对象
    • 基础类型
    • 数组类型




    二、new 运算符 为 基础数据类型 / 基础数据数组类型 分配堆内存




    1、语法说明


    new 运算符 分配堆内存 语法 : new 运算符 作用是 在 堆内存中 为某个类型分配 内存空间 ;

    指针类型变量 = new 类型 ( 常量 )	// 创建 类 / 普通类型 变量
    指针类型变量 = new 类型 			// 创建 类 / 普通类型 变量 , 省略 常量
    指针类型变量 = new 类型 [ 数字 ]	// 创建数组 , 中括号中是 数组元素个数
    
    • 1
    • 2
    • 3
    • 小括号 中的 常量值 是可以省略的 ;
    • 中括号 表示的是为 数组类型 分配内存空间 , 中括号内是 数组元素个数 ;

    2、语法简单示例


    new 运算符 使用示例 :

    • 创建 普通类型 变量 : 堆内存 中 创建 int 类型 存储空间 , 返回 指向该内存空间 的 指针 ( 空间地址 ) ;
    int* ptr = new int;
    
    • 1
    • 创建 普通类型 变量 并设置初始值 : 堆内存 中 创建 int 类型 存储空间 , 并为其设置初始值 9527 , 返回 指向该内存空间 的 指针 ( 空间地址 ) ;
    int* ptr = new int(9527);
    
    • 1
    • 创建 普通数组类型 变量 : 堆内存 中 创建 int 数组类型 存储空间 , 返回 指向该内存空间 的 指针 ( 空间地址 ) , 中括号中是 数组元素个数 ;
    int* ptr = new int[8];
    
    • 1
    • 创建 普通二维数组类型 变量 : 堆内存 中 创建 int 二维数组类型 存储空间 , 返回 指向该内存空间 的 指针 ( 空间地址 ) , 中括号中是 数组元素个数 ;
    int* ptr = new int[4][8];
    
    • 1

    3、代码示例 - 基础类型内存分配


    在 C 语言中使用 malloc 函数 动态申请堆内存 , 使用 free 函数 释放内存 ;

    在 C++ 语言中 , 使用 new 基础数据类型 申请内存 ,

    int* p2 = new int;
    
    • 1

    使用 delete(指针变量) 释放内存 ;

    delete(p2);
    
    • 1

    代码示例 :

    	// I. 基础类型内存分配
    	
    	// C 语言中动态申请内存
    	int* p = (int*)malloc(sizeof(int));
    	*p = 10;
    
    	// C++ 语言中动态申请内存
    	int* p2 = new int;
    	*p2 = 20;
    
    	cout << "*p = " << *p << " , *p2 = " << *p2 << endl;
    
    	// C 语言中 释放内存 与 malloc 相对应
    	free(p);
    
    	// C++ 语言中 释放内存 与 new 相对应
    	delete(p2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4、代码示例 - 基础数组类型内存分配


    在 C 语言中使用 malloc 函数 动态申请堆内存 , 使用 free 函数 释放内存 ;

    在 C++ 语言中 , 使用 new 基础数据类型[数组元素个数] 申请内存 ,

    int* array2 = new int[2];
    
    • 1

    使用 delete(指针变量) 释放内存 ;

    delete(array2);
    
    • 1

    代码示例 :

    	// II. 数组类型内存分配
    
    	// C 语言中动态申请内存
    	int *array = (int*)malloc(sizeof(int) * 2);
    	array[0] = 9527;
    	array[1] = 3859;
    
    	// C++ 语言中动态申请内存
    	int* array2 = new int[2];
    	array2[0] = 1234;
    	array2[1] = 5678;
    
    	cout << "array[0] = " << array[0] << " , array2[0] = " << array2[0] << endl;
    
    	// C 语言中 释放内存 与 malloc 相对应
    	free(array);
    
    	// C++ 语言中 释放内存 与 new 相对应
    	delete(array2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19




    三、完整代码示例 - new 运算符 为 基础数据类型 / 基础数据数组类型 分配堆内存



    代码示例 :

    #include "iostream"
    using namespace std;
    
    int main()
    {
    	// I. 基础类型内存分配
    	
    	// C 语言中动态申请内存
    	int* p = (int*)malloc(sizeof(int));
    	*p = 10;
    
    	// C++ 语言中动态申请内存
    	int* p2 = new int;
    	*p2 = 20;
    
    	cout << "*p = " << *p << " , *p2 = " << *p2 << endl;
    
    	// C 语言中 释放内存 与 malloc 相对应
    	free(p);
    
    	// C++ 语言中 释放内存 与 new 相对应
    	delete(p2);
    
    	// II. 数组类型内存分配
    
    	// C 语言中动态申请内存
    	int *array = (int*)malloc(sizeof(int) * 2);
    	array[0] = 9527;
    	array[1] = 3859;
    
    	// C++ 语言中动态申请内存
    	int* array2 = new int[2];
    	array2[0] = 1234;
    	array2[1] = 5678;
    
    	cout << "array[0] = " << array[0] << " , array2[0] = " << array2[0] << endl;
    
    	// C 语言中 释放内存 与 malloc 相对应
    	free(array);
    
    	// C++ 语言中 释放内存 与 new 相对应
    	delete(array2);
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    执行结果 :

    *p = 10 , *p2 = 20
    array[0] = 9527 , array2[0] = 1234
    Press any key to continue . . .
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  • 相关阅读:
    秋招如何做好IT面试准备
    自动化项目倍加福测距仪QSM WCS RS485 与西门子S7 200通信
    写代码时候的命名规则、命名规范、命名常用词汇
    使用SPACEDESK时iPad显示Connected-Display OFF解决方法
    TypeScript——泛型理论与实践
    解析虚拟文件系统的调用
    微软推出 Hierarchical Transformer 实现更高准确率的语音评测
    Spring-Spring之AOP底层源码解析(下)
    python经典百题之各项数想加之和
    MySQL导出数据为csv的方法(亲测)
  • 原文地址:https://blog.csdn.net/han1202012/article/details/133049120