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

C++---动态内存分配 new delete_第1张图片

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


一.利用new创建内存

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

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

数据类型 *指针变量 = new 数据类型;  //默认值为随机值
数据类型 *指针变量 = new 数据类型(初始值);
数据类型 *指针变量 = new 数据类型{初始值};
//动态创建基本类型对象(变量)
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.创建数组

数据类型 *指针变量 = new 数据类型[数组长度];//没有初始化默认值是随机值
数据类型 *指针变量 = new 数据类型[数组长度]{初始化列表};
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出来的内存空间,并自动调用其析构函数。格式如下:

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

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

#include 
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是安全的。

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的格式不匹配导致的后果是不确定的。


本篇完.

你可能感兴趣的:(C++学习,c++)