C++ new/delete 与 malloc/free 的区别?

new/delete 与 malloc/free 的区别?

  1. 分配内存的位置
    1. malloc是从上动态分配内存
    2. new是从自由存储区为对象动态分配内存。自由存储区的位置取决于operator new的实现。自由存储区不仅可以为堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存
  2. 是否可以被重载
    1. opeartor new 、operator delete 可以被重载
    2. malloc、free则不能重载
  3. 内存分配
    1. malloc内存分配成功后返回void*,然后再强制类型转换为需要的类型
      1. malloc内存分配失败后返回 NULL
    2. new操作符分配内存成功后返回与对象类型相匹配的指针类型;因此new是符合类型安全的操作符
      1. new分配内存失败则会抛异常 std::bad_alloc
      2. 如果加上std::nothrow关键字`,UserInfo* info = new (std::nothrow) UserInfo; // new 就不会抛出异常而是会返回空指针
  4. 分配内存的大小的计算
    1. 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算
    2. malloc则需要显式地指出所需内存的尺寸
  5. 使用场景
    1. new/delete 适用于C++对象,它们会自动处理对象的构造和析构。
    2. malloc/free 更通用,可以在C++中使用,也可以在C中使用,但需要手动管理对象的构造和析构。
// 使用 malloc 分配内存 并 强制类型转换
UserInfo* user = static_cast<UserInfo*>(malloc(sizeof(UserInfo)));

// 构造对象
new (user) UserInfo("Alice", 25);

// 使用对象指针调用成员函数
std::cout << "User's age: " << user->getAge() << std::endl;

// 手动调用析构函数
user->~UserInfo();

// 释放内存
free(user);

你可能感兴趣的:(CPP,c++,开发语言,c++,operator)