美文网首页
C++之new和delete

C++之new和delete

作者: 二进制人类 | 来源:发表于2022-10-25 10:28 被阅读0次

概述

new是从堆区申请空间(作用等价于c语言:malloc calloc realloc)

delete是释放堆区空间(作用等价于c语言:free)

new和delete 操作的是基本类型的空间 和 malloc calloc realloc free 没有任何区别。

new和delete 操作的是自定义类型的空间 只能使用 new和delete。

new和delete操作基本类型空间

//从堆区申请int类型的空间
int *p1 = new int;
*p1 = 100;
cout<<"*p1 ="<<*p1<<endl;//100
delete p1;
//从堆区申请int类型的空间 并初始化为100
int *p1 = new int(100);
cout<<"*p1 ="<<*p1<<endl;//100
delete p1;

new和delete操作基本类型一维数组空间

//需求:从堆区申请一个int数组 有5个元素
//int *arr = new int[5]{10,20,30,40,50};
int *arr = new int[5];
int i=0;
for(i=0;i<5;i++)
{
    cout<<arr[i]<<" ";
}
cout<<endl;
//注意:释放空间
delete [] arr;//释放数组的所有元素空间
//delete arr 只能释放第0个元素的空间

new和delete操作基本类型二维数组空间

//int (*arr)[4] = new int[3][4];
int (*arr)[4] = new int[3][4]{{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int i=0;
for(i=0;i<3;i++)
{
    int j=0;
    for(j=0;j<4;j++)
    {
        cout<<arr[i][j]<<" ";
    }
    cout<<endl;
}
cout<<endl;

delete [] arr;

必须使用new和delete操作类的对象空间

new 能申请空间 和 调用构造函数 malloc calloc 只能申请空间 不能调用构造函数。必须用new

delete 能调用析构函数 和 释放空间 free只能释放空间。必须用delete.

使用new和delete操作对象数组空间

1.普通对象数组

class A
{
public:
    int m_A;
public:
    A()
    {
        m_A=0;
        cout<<"A无参构造 m_A="<<m_A<<endl;
    }
    A(int a)
    {
        m_A = a;
        cout<<"A有参构造 m_A="<<m_A<<endl;
    }
    ~A()
    {
        cout<<"A析构函数 m_A="<<m_A<<endl;
    }
};

void test(){
    //普通对象数组:每个元素为对象
    //创建对象数组的时候 每个元素都会调用构造函数
    //对象数组结束的时候 每个元素都会调用析构函数
    A arr[5];
}

2.普通对象数组初始化:每个元素必须显示调用构造函数初始化

class A
{
private:
    int m_A;
    int m_B;
public:
    A()
    {
        m_A=0;
        cout<<"A无参构造 m_A="<<m_A<<endl;
    }
    A(int a, int b)
    {
        m_A = a;
        m_B = b;
        cout<<"A有参构造 m_A="<<m_A<<", m_B="<<m_B<<endl;
    }
    ~A()
    {
        cout<<"A析构函数 m_A="<<m_A<<", m_B="<<m_B<<endl;
    }
    void showA()
    {
        cout<<"m_A="<<m_A<<", m_B="<<m_B<<endl;
    }
};
void test()
{
    //普通对象数组:每个元素为对象 尽量显示调用有参构造进行元素的初始化
    //创建对象数组的时候 每个元素都会调用构造函数
    //对象数组结束的时候 每个元素都会调用析构函数
    A arr[5]={A(10,20),A(11,22),A(12,23),A(13,24),A(14,25)};

    int i=0;
    for(i=0;i<5;i++)
    {
        arr[i].showA();
    }
}

堆区对象数组

class A
{
private:
    int m_A;
    int m_B;
public:
    A()
    {
        m_A=0;
        cout<<"A无参构造 m_A="<<m_A<<endl;
    }
    A(int a, int b)
    {
        m_A = a;
        m_B = b;
        cout<<"A有参构造 m_A="<<m_A<<", m_B="<<m_B<<endl;
    }
    ~A()
    {
        cout<<"A析构函数 m_A="<<m_A<<", m_B="<<m_B<<endl;
    }
    void showA()
    {
        cout<<"m_A="<<m_A<<", m_B="<<m_B<<endl;
    }
};
void test()
{
    A *arr = new A[5]{A(10,20),A(11,22),A(12,23),A(13,24),A(14,25)};
    int i=0;
    for(i=0;i<5;i++)
    {
        //arr[i].showA();
        //(*(arr+i)).showA();
        (arr+i)->showA();
    }
    delete [] arr;
}

new delete和malloc free的区别

1、new不需要对申请的空间地址类型转换 malloc需要

2、new数组空间的时候 delete释放数组空间需要加[] free不需要

3、new 申请对象空间会调用构造函数 而malloc不会

4、delete释放对象空间会调用析构函数 而free不会(建议C++中使用new和delete)

delete不要释放void*指针,可能造成析构函数无法调用

相关文章

  • C++内存

    认识C++内存 operator new, operator delete和new, delete operato...

  • new失败抛出异常吗?

    new/delete 在C++中动态分配与释放内存是通过new/delete和new []/delete []实现...

  • 面试准备

    C++面试总结 New、Delete和malloc、free的区别? New和Delete自动调用 构造函数 和 ...

  • Boolan C++ 第五周 new和delete

    一、new和delete new和delete 是C++ 动态分配和释放内存的重要方式。当new一个对象时 先分配...

  • C++之new和delete

    概述 new是从堆区申请空间(作用等价于c语言:malloc calloc realloc) delete是释放堆...

  • delete 和 delete []

    每一本 C++ 教材上都会告诉你,使用new,new [],delete 和 delete [] 的时候必须要配对...

  • Effective c++学习笔记(item16)对成对的new

    Effective c++学习笔记(item16)对成对的new和delete使用相同的形式 new 和new[]...

  • c++ new 和delete的种种

    new/delete动态管理对象,new[]/delete[]动态管理对象数组。 C++中,把int 、char....

  • C++<第二十二篇>:new和delete运算符

    new 和 delete 是C++在C之后新增的两个运算符,new用来分类内存,delete用来释放内存。 (1)...

  • C++笔记5--(Boolan)

    new和delete的工作原理 new和delete是C++新引入的单目运算符,它们可以从堆上分配和删除存储块(堆...

网友评论

      本文标题:C++之new和delete

      本文链接:https://www.haomeiwen.com/subject/tmqbzrtx.html