C++中new,delete初识

知识点1【new delete】
new:申请空间,调用构造函数
delete:调用析构函数,释放空间
先来个类

class Person
{
private:
    char m_name[32];
    int m_num;
public:
    Person()
    {
        cout<<"无参构造"<<endl;
    }
    Person(char *name,int num)
    {
       cout<<"有参构造"<<endl;
       strcpy(m_name,name);
       m_num=num;
       cout << m_name<<endl;
       cout <<m_num<<endl;
    }
    ~Person()
    {
       cout<<"析构"<<endl;
    }
    void showPerson()
    {
        cout <<"名字:"<<m_name<<",年龄:"<<m_num<<endl;
    }

};

1、new 申请 基本类型数组空间

void test01()
{
    //char *arr = new char[32]{"hello"};//不可以
    char *arr = new char[32];
    strcpy(arr,"hello");
    cout <<arr <<endl;
    delete [] arr;
}

运行结果
在这里插入图片描述
2、new delete 给类对象申请空间

void test01()
{
    Person *p = new Person;//无参构造被屏蔽;解决方法:1、人为申请一个无参构造
    Person *p1 = new Person("lucy",100);//有参调用

    //p->showPerson();
    p1->showPerson();

    //先调用析构函数,再释放堆区空间。
    delete p;
}

运行结果:
在这里插入图片描述3、对象数组:本质是数组 只是数组的每个元素是类的对象
a、基础的静态数组

对象数组arr是数组,每个元素是Person类型的对象
定义对象数组的时候,系统会自动给数组中每个元素调用构造函数
自动调用无参构造
void test02()
{
   
    Person arr[5];

}

运行结果:

在这里插入图片描述
b、如果想让对象数组中的元素调用有参构造 必须人为使用 有参构造初始化。
// 对象数组arr1是数组,每个元素是Person类型的对象
//定义对象数组的时候,系统会自动给数组中每个元素调用构造函数
//人为调用有参构造
//初始化部分,调用有参构造,未初始化部分调用无参构造

void test03()
{

    Person arr[5]={Person("lucy",18),Person("bob",20)};
    arr[0].showPerson();
    arr[1].showPerson();
}

运行结果:
在这里插入图片描述
c、用new,delete申请对象数组

void test04()
{
    //第一种方式
    Person *arr =NULL;
    arr = new Person[5];

    //第二种方式
    Person *arr1 = new Person[5]{Person("lucy",10)};
    (*(arr1+0)).showPerson();
    arr1[0].showPerson();

    delete [] arr;
    delete [] arr1;
}

在这里插入图片描述
尽量不要用delete释放void *,释放会出现问题:

void test05()
{
    Person *p = new Person("lucy",18);
    p->showPerson();

    void *p1 = p;

    delete p1;
}

运行结果:
在这里插入图片描述
没有析构的原因:delete 发现p1指向的类型为void,无法从void中寻找相应的构造,析构函数。可是选择delete p1;系统不知道该释放的空间大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值