C++---动态内存分配 new delete

在C++中,new和delete 是用于动态内存分配和释放的关键字。


一.利用new创建内存🍗

new是在堆区申请一块连续的内存空间,如果申请成功,则返回内存指针;如果申请失败,则返回NULL;new申请内存空间的过程,通常称为new一个对象。与 malloc()相比:
1.new是关键字,不需要引用头文件(malloc需要引用stdlib.h或者malloc.h)
2.new创建动态对象时会自动调用对象的构造函数;
3.new能够根据初始化列表中的值进行初始化。

1.创建单个变量(对象)

cpp 复制代码
数据类型 *指针变量 = new 数据类型;  //默认值为随机值
数据类型 *指针变量 = new 数据类型(初始值);
数据类型 *指针变量 = new 数据类型{初始值};
cpp 复制代码
//动态创建基本类型对象(变量)
int main()
{
    int* p1 = new int;//这个没有初始化,随机值(0xcdcdcdcd)
    cout << *p1 << endl;
    int* p2 = new int();//写了初始化列表,没有给值默认为0
    cout << *p2 << endl;
    int* p3 = new int(100);//初始化为100
    cout << *p3 << endl;
    int* p4 = new int{200};//初始化为200(列表初始化的方式)
    cout << *p4 << endl;

    return 0;
}

2.创建数组

cpp 复制代码
数据类型 *指针变量 = new 数据类型[数组长度];//没有初始化默认值是随机值
数据类型 *指针变量 = new 数据类型[数组长度]{初始化列表};
cpp 复制代码
int main()
{
    int* p1 = new int[10];//创建10长度的int数组,都是随机值
    for (int i = 0; i < 10; i++)
        cout << p1[i]<<" ";
    cout << endl;
    int* p2 = new int[10] {1,2,3,4,5,6,7,8,9,10};//创建10长度的int数组,并初始化为1~10
    for (int i = 0; i < 10; i++)
        cout << p2[i]<<" ";
    cout << endl;
    int* p3 = new int[10] {1,2,3,4,5};//创建10长度的int数组,并初始化为1,2,3,4,5,0,0,0,0,0
    for (int i = 0; i < 10; i++)
        cout << p3[i] << " ";
    cout << endl;

    return 0;
}

二.利用delete释放内存🍗

用new运算符分配的内存在使用后要及时释放以免造成内存泄漏,C++提供了delete运算符释放new出来的内存空间,并自动调用其析构函数。格式如下:

cpp 复制代码
delete 指针名;//释放单个的内存对象(变量)
delete []指针名;//释放申请的数组对象(变量)

delete有两种使用方式,需要配合new的方式使用:
1.如果new创建的是单个变量(对象),则使用delete 指针名;
2.如果new创建的是数组变量(对象),则使用delete []指针名;

cpp 复制代码
#include <iostream>
using namespace std;
int main()
{
    int* p1 = new int;  //创建int,随机值,在vs2022中是-842150451(0xcdcdcdcd)
    int* p2 = new int(10);//创建int,初始化为10
    char* p3 = new char[10];//创建长度为10的char数组,随机值(在vs2022中是0xcd)
    char* p4 = new char[10] {"趣字节"};//创建长度为10的char数组,初始化为"趣字节"

    cout << *p1 << endl << *p2 << endl;
    cout << p3 << endl;
    cout << p4 << endl;

    delete p1;//释放p1指向的动态内存
    delete p2;//释放p2指向的动态内存
    delete[]p3;//释放p3指向的动态内存,是数组
    delete[]p4;//释放p4指向的动态内存,是数组

    return 0;
}

注意:
1.一定要配对的使用new和delete,否则出现内存泄漏;
2.不要多次释放同一段动态内存,C++标准指出,这样做的结果将是不确定的,这意味着什么情况都可能发生;
3.不能使用delete释放不是动态创建的内存;
4.对空指针使用delete是安全的。

cpp 复制代码
int main()
{
    int* p1 = new int[5];
    delete p1;//错误1,使用new []分配,应该使用delete []p1;

    int* p2 = new int;
    int* p3 = p2;
    delete p2;
    delete p3;//错误2,多次delete同一段内存

    int arr[5];
    int* p4 = arr;
    delete p4;//错误3,delete不能释放非动态内存

    int* p5 = NULL;
    delete p5;//正确,delete 空指针是安全的
    delete NULL;//语法错误,这条语句没有意义

    return 0;
}

delete []中的方括号告诉程序,应释放整个数组,而不仅仅是指针指向的一个元素。如果使用new时,不带方括号,则使用delete时,不带方括号。如果使用new时带方括号,则使用delete时也应带方括号。对于C++标准来说,new和delete的格式不匹配导致的后果是不确定的。


本篇完.🍗

相关推荐
瞌睡不来1 小时前
(刷题记录5)盛最多水的容器
c++·笔记·学习·题目记录
何陈陈1 小时前
【Linux】线程池
linux·服务器·开发语言·c++
夏旭泽1 小时前
C-include
开发语言·c++
感谢地心引力2 小时前
【Qt】Qt安装(2024-10,QT6.7.3,Windows,Qt Creator 、Visual Studio、Pycharm 示例)
c++·windows·python·qt·visual studio
T0uken2 小时前
【QT Quick】C++交互:调用QML函数
c++·qt·交互
Two_brushes.2 小时前
C++ list 容器类的模拟实现
开发语言·c++·list
王俊山IT3 小时前
C++学习笔记----8、掌握类与对象(五)---- 嵌套类与类中枚举
开发语言·c++·笔记·学习
心怀花木3 小时前
【算法】双指针
c++·算法
闫铁娃3 小时前
二分解题的奇技淫巧都有哪些,你还不会吗?
c语言·数据结构·c++·算法·leetcode
T0uken4 小时前
【QT Quick】C++交互:QML对象操作
c++·qt·交互