new && delete

该文演示了C++中使用new和delete操作符在堆区动态分配和释放内存的过程,包括单个对象、数组以及带有参数的构造函数。文章还强调了析构函数在对象生命周期中的作用,以及不正确使用delete可能导致的内存泄漏问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<bits/stdc++.h>

using namespace std;

class Test
{
private:
    int num;
    int* p=nullptr;
    
public:
    Test()
    {
        cout<<"无参构造"<<endl;
    }
    
    Test(int n)
    {
        cout<<"有参构造"<<endl;
        p=new int[n];
    }
    
    ~Test()
    {
        if(p) delete[]p;
        cout<<"析构函数"<<endl;
    }
};

int main()
{
    //new 在堆区申请内存,不需要传入具体的字节数
    //new 会先调用 malloc 申请内存,然后调用对应的构造函数
    //delete 会先析构,然后调用free
    
    int* p=new int; //在堆区申请了一个 int 类型的变量 4 个字节,值为随机值
    cout<<*p<<endl;
    delete p;
    
    int* p1=new int(3); //在堆区申请了一个 int 类型的变量 4 个字节,值为3
    cout<<*p1<<endl;
    delete p1;
    
    int* p2=new int[3]; //在堆区申请了三个 int 类型的变量 12 个字节,值为随机值
    cout<<p2[0]<<' '<<p2[1]<<' '<<p2[2]<<endl;
    delete[]p2;
    
    int* p3=new int[3]{1,2,3}; //在堆区申请了三个 int 类型的变量 12 个字节,值为随机值
    cout<<p3[0]<<' '<<p3[1]<<' '<<p3[2]<<endl;
    delete[]p3;
    
    Test* t=new Test; //调用无参构造,创建了 Test 类型的对象
    delete t;
    
    Test* t1=new Test(); //调用无参构造,创建了 Test 类型的对象
    delete t1;
    
    Test* t2=new Test[3]; //创建了 Test 类型的数组,包含了三个元素,调用无参构造
    delete[]t2; //delete t2; 只会释放首元素,造成内存泄漏也就是内存的丢失
    
    Test* t3=new Test[3]{Test(),Test(1),Test(2)};
    delete[]t3;
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值