c++new和delete

1.利用new创建内存

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

p1只是动态创建,并没有初始化,它里面是随机值,但在VS2022给了一个特定的值0xcdcdcdcd,这个值会因平台不同而不同。
C++11新增了p4这种写法,利用列表初始化给p4进行初始化。

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;
}

2.利用delete释放内存

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

delete 指针名;//释放单个的内存对象(变量)

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

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

例:

#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] {"hello"};//创建长度为10的char数组,初始化为"hello"

    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的格式不匹配导致的后果是不确定的。
一般来说,不要用两个指针指向同一个动态创建的内存,因为这将增加错误删除同一段内存两次的可能性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值