1. 动态内存分配方式
new
运算符:
- 在C++中,
new
用于动态分配内存并初始化对象。例如,分配一个int
类型的变量:int* ptr = new int;
,这不仅分配了足够存储int
类型数据的内存,还调用了int
类型的默认构造函数(对于基本类型,默认构造函数无实际操作)。如果要分配一个包含初始值的int
变量,可以写成int* ptr = new int(5);
。
- 分配数组时使用
new[]
,如int* arr = new int[10];
,这里会为10个int
类型的元素分配连续的内存空间,并依次调用每个元素的默认构造函数(对于基本类型无实际操作)。
malloc
函数:
malloc
是C标准库函数,用于分配指定字节数的内存。例如,分配一个int
类型变量的内存:int* ptr = (int*)malloc(sizeof(int));
。它只负责分配内存,不会调用构造函数。
- 分配数组时,同样根据所需总字节数进行分配,如
int* arr = (int*)malloc(10 * sizeof(int));
,同样不会调用构造函数。
2. 区别
- 用法区别:
- 语法形式:
new
是C++的运算符,使用简单直观,直接跟数据类型;malloc
是函数,需要传入要分配的字节数。例如new int
和malloc(sizeof(int))
。
- 对象初始化:
new
会调用对象的构造函数进行初始化(对于自定义类型),而malloc
不会,它只是分配内存空间。比如有一个自定义类class MyClass {public: MyClass() { std::cout << "Constructor called" << std::endl; } };
,MyClass* obj1 = new MyClass;
会输出构造函数中的信息,而MyClass* obj2 = (MyClass*)malloc(sizeof(MyClass));
不会调用构造函数。
- 数组分配:
new[]
分配数组时会记录数组大小(以便delete[]
正确释放),malloc
分配数组只是分配一块连续内存,没有数组大小的记录。
- 内存管理区别:
- 释放方式:
new
分配的内存用delete
释放,new[]
分配的内存用delete[]
释放,如delete ptr;
和delete[] arr;
。malloc
分配的内存用free
释放,如free(ptr);
和free(arr);
。如果释放方式不匹配,会导致内存泄漏或未定义行为。
- 异常处理:
new
在内存分配失败时会抛出std::bad_alloc
异常,而malloc
在内存分配失败时返回NULL
。例如:
try {
int* ptr = new int;
} catch (const std::bad_alloc& e) {
std::cerr << "Memory allocation failed: " << e.what() << std::endl;
}
int* ptr2 = (int*)malloc(sizeof(int));
if (ptr2 == NULL) {
std::cerr << "Memory allocation failed" << std::endl;
}
- 返回值区别:
new
返回指向分配内存的对象类型指针,类型安全,无需显式类型转换。例如int* ptr = new int;
。
malloc
返回void*
类型指针,使用时需要显式类型转换为所需类型指针,如int* ptr = (int*)malloc(sizeof(int));
。