C++的内存管理方式

一、前言:

C语言中的内存管理方式当然可以继续沿用至C++,但是仍然存在许多地方比较吃力,所以C++又创立了自己的内存管理方式:即通过new 和 delete操作符来进行动态内存管理。

二、new和delete操作内置类型:

void Test()
{
  int* p1 = new int;//动态申请一个int类型的空间

  int* p2 = new int(3);//动态申请一个int类型的空间并将其初始化为3

  int* p3 = new int[3];//动态申请三个int类型的空间

  int* p4 = new int[3]{1,2,3};//动态申请三给int类型的空间并分别将其初始化为1,2,3
  
  delete p1;

  delete p2;
 
  delete[] p3;
  
  delete[] p4;
}

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

三、new和delete操作自定义类型:

        注意:在申请自定义空间的时候,new会自动调用构造函数,delete会自动调用析构函数,而malloc和free则不会调用。

class A
{
  public:
       A(int a = 0)
       :_a(a)
           {
             cout<<"A():"<<this<<endl;
           }
        ~A()
          {
             cout<<"~A()"<<this<<endl;
          }

  private:
       int _a;
};
int main() 
{  
    // new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间 还会调用构造函数和析构函数
    A* p1 = (A*)malloc(sizeof(A));

    A* p2 = new A(1); 

    free(p1); 

    delete p2;
    
    //内置类型几近一样
    int* p3 = (int*)malloc(sizeof(int));
    
    int* p4 = new int;
   
    free(p3);
    delete(p4);
     
    A* p5 = (A*)malloc(sizeof(A)*5); 
    
    A* p6 = new int[5];
  
    free(p5);
    delete[] p6;
    
    return 0;
}

四、operator new/delete函数:

1.newdelete是用户进行动态内存申请和释放的操作符,operator new operator delete是系统提供的全局函数new在底层调用operator new全局函数来申请空间,delete在底层通过 operator delete全局函数来释放空间。

2.operator new/delete的底层又是通过malloc和free来实现的,不过与其不同的是当operator失败时会抛异常而非返回空。

五、new和delete的实现原理:

        1.内置类型:

              当申请内置类型的时候,new/delete和malloc/free基本相同,但注意new/delete仅仅针对单个空间,想要对连续的多个空间进行操作需要new[]和delete[]才行。

         2. 自定义类型:

                1.new的原理:

                      (1).调用operator new函数申请空间

                      (2).在申请的空间上调用构造函数,实现对象的构造。

                2.delete的原理:

                     (1).调用析构函数,实现对象中资源的清理工作。

                     (2).调用operator delete函数进行释放相应对象空间的操作。

                3.new T [N]的原理:

                   (1). 调用operator new[]函数,在operator new[]中会调用operator new函数完成N个对象空间的申请。

                   (2). 在申请的空间上调用N次构造函数。

                4.delete[]的原理:

                   (1). 在释放的对象空间上执行N次析构函数,实现对N个对象中资源的清理.

                  (2).调用 operator delete[] 释放空间,然后在 operator delete[] 中调用 operator delete 来释
放空间.

                    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值