C/C++内存分布以及相比于malloc,C++中new和delete优点

一.C/C++内存分布特点

练习:

二.new与delete

new:operator new(底层为malloc用来开辟空间) + 构造函数

delete:析构函数 + operator delete(底层为free用来释放空间)

1. 类型安全

  • new 和 delete:在分配内存时会返回合适类型的指针,不需要手动进行类型转换。使用 new 时可以直接获得目标类型的指针。
     

    MyClass* obj = new MyClass(); // 自动转换为 MyClass*

  • malloc 和 free:返回 void*,需要手动进行类型转换。
     

    MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // 需要显式转换

2. 调用构造与析构函数

  • new 和 delete:在分配对象时,会自动调用构造函数;在释放对象时,会自动调用析构函数,确保资源释放和清理。
     

    MyClass* obj = new MyClass(); // 调用构造函数 delete obj; // 调用析构函数

  • malloc 和 free:不调用任何构造或析构函数,只是简单地分配和释放内存。
     

    MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // 不调用构造函数 free(obj); // 不调用析构函数

3. 异常处理

  • new:如果内存分配失败,会抛出 std::bad_alloc 异常,这使得错误处理更加便捷。
     

    try { MyClass* obj = new MyClass(); } catch (const std::bad_alloc& e) { // 处理内存分配失败 }

  • malloc:如果分配失败,会返回 NULL,调用者需要自行检查和处理。
     

    MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); if (obj == NULL) { // 处理内存分配失败 }

4. 数组分配

  • new[] 和 delete[]:专门用于数组对象的分配和释放,能够正确调用每个元素的构造和析构函数。
     

    MyClass* array = new MyClass[10]; // 分配数组 delete[] array; // 正确析构每个元素

  • malloc 和 free:可以用来分配和释放数组,但不会调用任何构造或析构函数。
     

    MyClass* array = (MyClass*)malloc(sizeof(MyClass) * 10); // 不调用构造函数 free(array); // 不调用析构函数

5. 内存检查

  • new 和 delete:可以重载,用于跟踪内存的使用情况,便于调试和性能优化。
  • malloc 和 free:不支持重载,灵活性较差。

总结

C++ 的 new 和 delete 提供了更强的类型安全、自动管理资源和异常处理机制,使得 C++ 在面向对象编程上更为高效和安全。这些特性使得 C++ 推荐使用 new 和 delete 进行动态内存管理,而不使用 C 的 malloc 和 free

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值