动态对象创建

本文探讨了C语言中malloc和free的使用,包括手动内存管理的注意事项,以及C++中new操作符的优势。new不仅负责分配内存,还会调用构造函数进行初始化,而malloc则不会。在使用delete释放内存时,new和delete需要匹配使用,new[]对应delete[]。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动态对象创建


C语言中malloc和free的问题:


    1. 程序员必须确定对象的长度;
    2. malloc 返回一个 void*指针,C++不允许将 void*赋值给其他任何指针, 故必须强转;
    3. malloc 可能申请内存失败, 所以必须判断返回值来确保内存分配成功;
    4. 用户在使用对象之前必须记住对他初始化, 构造函数不能显示调用初始化(构造函数是由编译器调用), 用户有可能忘记调用初始化函数。


new operator


    new 会返回一个该类型的指针。
    默认调用构造函数,开辟空间,返回不是void*,不要强制转换
    delete 释放
    new 对象用 void* 去接收,释放不了对象
    new 出来的是数组,如何释放?delete [] ...
    new 出来的是数组,肯定调用默认构造
    
    Person * person = new Person;//堆区开辟
    相当于:
    Person* person = (Person*)malloc(sizeof(Person));
    if(person == NULL){
        return 0;
    }
    person->Init();//构造函数
    
    New操作符能确定在调用构造函数初始化之前内存分配是成功的,所以不用显示确定调用是否成功。
    
    所有new出来的对象, 都会返回该类型的指针。
    malloc 返回 void* 还要强转。
    malloc 会调用构造吗? 不会。 
    new 默认调用构造函数,开辟空间,返回不是void* ,不需要强转。 
    new 运算符; malloc 函数。
    释放 堆区空间
    delete p2;
    delete 运算符 要配合 new 使用; malloc 配合 free 用
    
    通过new开辟数组, 一定会调用默认构造函数,故一定要提供默认构造函数
    Person006* pArray = new Person006[10];

    在栈上开辟数组, 可以指定有参构造
    Person006 pArray[2] = { Person006(1),Person006(2)};

    如果在 new 表达式中使用[], 必须在相应的 delete 表达式中也使用 []。如果在 new 表达式中不使用 [] ,一定不要在相应的 delete 表达式中使用 []。

class Person006 {
public:
	Person006() {
		cout << "Person's default constructor." << endl;
	}

	Person006(int a) {
		cout << "Person's parameterized constructor." << endl;
	}

	~Person006() {
		cout << "Person's destructor." << endl;
	}
};

void test0006() {
	Person006 p1;//栈区开辟
	Person006* p2 = new Person006;//堆区开辟
	delete p2;

	//当void* 接收new出来的指针, 会出现释放的问题
	void* p = new Person006;
	//无法释放 p, 所以避免这种写法
	delete p;

	//通过new开辟数组, 一定会调用默认构造函数,故一定要提供默认构造函数
	Person006* pArray = new Person006[10];

	//在栈上开辟数组, 可以指定有参构造
	Person006 pArray2[2] = { Person006(1),Person006(2) };

	//释放数组
	delete[] pArray;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值