[C++系列] 37. C++内存管理方式

1. 与C的区别

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

并且,C语言对内存的3个操作都是库函数,而C++中申请空间new及释放空间delete两者都为关键字。

2. new、delete操作内置类型

void Test() {
     // 动态申请一个int类型的空间
     int* ptr4 = new int;
     
     // 动态申请一个int类型的空间并初始化为10
     int* ptr5 = new int(10);
     
     // 动态申请10个int类型的空间
     int* ptr6 = new int[3];
    
     delete ptr4;
     delete ptr5;
     delete[] ptr6;
}

 注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]

 3. new、和delete操作自定义类型

class Test {
public:
    Test()
        : _data(0) {
        cout<<"Test():"<<this<<endl;
    }
 
    ~Test() {
        cout<<"~Test():"<<this<<endl;
    }
    
private:
    int _data;
};
 
void Test2() {
    // 申请单个Test类型的空间
    Test* p1 = (Test*)malloc(sizeof(Test));
    free(p1);
    
    // 申请10个Test类型的空间
    Test* p2 = (Test*)malloc(sizoef(Test) * 10);
    free(p2);
}
 
void Test2() {
    // 申请单个Test类型的对象,进行1次构造函数初始化
    Test* p1 = new Test;
    delete p1;
    
    // 申请10个Test类型的对象,并进行10次构造函数初始化
    Test* p2 = new Test[10];
    delete[] p2;
}

注意:在申请自定义类型的空间时,new会调用构造函数进行初始化工作,delete会调用析构函数进行资源清理再释放空间,而malloc与free不会。

那么调用顺序就是先进行空间申请,再在所申请好的空间上进行初始化工作。先进行析构进行资源清理,再去释放空间。

内置类型malloc与free,new与delete相差不大,在针对内置类型就没有构造函数与析构函数的定义。但是new进行申请空间时不需要进行强转即字节计算,有助于提高程序员的幸福感!

4. 对称使用

用new申请一定要delete进行释放,用new[]申请的一定要用delete[]进行释放,若是new申请用free释放,malloc申请delete释放的话就会导致出错。

比如:采用new申请用free进行释放时,因为free没有调用析构函数,导致资源清理工作没有进行,可能申请堆上的资源或者打开文件的操作,资源没有被清理,极有可能造成内存泄露。程序可能会崩溃,但也不是绝对会崩溃,可能会留有难以发现的隐患,是质量很低的代码。并且new、delete作为关键字,malloc、free作为函数,可能内部执行的逻辑都不一样,混作一团进行使用时肯定是极其错误的!

malloc-->free    new-->delete     new[]-->delete[]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值