C++:动态内存开辟和释放(new和delete)

#include <iostream>
#include <string>
using namespace std;

class Person
{
    public:
        Person()
        {
            cout<<"Person默认构造函数调用"<<endl;
        }
        
        Person(string iname):name(iname)
        {
            cout<<"Person有参构造函数调用"<<endl;
        }
        
        ~Person()
        {
            cout<<"Person析构函数调用"<<endl;
        }
        
        string name;
};

void test01()
{
    /*
    Person *p = new Person等价于以下3行代码:
    Person *p = (Person*) malloc(Person);
    if(NULL==p){return;}
    p->Person();//调用无参构造函数。
    */
    Person *p = new Person;// 调用无参构造函数。注意:须确保无参构造函数存在。
    Person *p2 = new Person("Lisi"); // 调用有参构造进行初始化。
    cout<<p2->name<<endl;
    delete p; // 调用析构函数。
    delete p2; // 调用析构函数。
    /*
    malloc和new的区别:
    1、new关键字和delete关键字是C++中的运算符,malloc和free是C标准库提供的库函数;
    2、new是以具体类型为单位进行内存分配,malloc是以字节单位进行内存分配;
    3、new在申请单个类型变量时可进行初始化,malloc不具备内存初始化特性;
    4、malloc申请的内存空间类型是void*,须进行强转,new申请的内存空间是对应类型,
    无须做强制转换。
    
  注意事项:
  1、不要用void*接收new构造出来的对象,利用void*无法调用析构函数。
    */
    
}

// 利用new开辟数组
void test02()
{
    // int* p_int = new int[5]; // 在堆区开辟了可以存放5个int型数的内存空间。
    // double *p_double = new double[10];
    
    // 在堆区开辟数组,一定会调用类的默认构造函数,因此须确保默认构造函数存在。
    Person *p_person = new Person[2];
    delete[] p_person;// 释放数组时,须在delete关键字后加上[]。
    
    // 在栈区开辟数组,可以没有默认构造函数。
    Person p_arr[3] = {Person("1"), Person("2"), Person("3")};
}
/*
浅拷贝:简单的赋值拷贝操作
深拷贝:在堆区重新开辟空间,进行拷贝操作
若属性有在堆区开辟的,须提供
    1、拷贝构造函数(为堆区属性开辟空间,以防止浅拷贝带来的问题);
    2、赋值运算符重载函数(为堆区属性开辟空间,以防止浅拷贝带来的问题);
    3、析构函数(用于释放堆区属性内存).
*/
int main()
{
    //test01();
    test02();
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值