泉州网站建设二级建造师个人注册查询系统
前言
- 在 C 语言中,动态内存分配主要是通过 
malloc()和free()函数来完成的。 - 而在 C++ 中是使用new和delete关键字,来动态分配内存。
 
虽然 C 语言没有 new,但 malloc() 和 new 在内存分配上的作用是相似的。下面我们详细解释 malloc() 和 new 的用法及其区别:
1. malloc()(C 语言中的动态内存分配)
 
malloc() 是 C 语言中用于动态分配内存的标准函数,定义在 <stdlib.h> 头文件中。它返回一个指向分配内存块的指针(如果分配成功),如果分配失败,则返回 NULL。
语法:
void* malloc(size_t size);
 
size:需要分配的字节数。- 返回值:返回一个 
void*类型的指针,指向分配的内存空间。如果分配失败,返回NULL。 
代码实例:
int *ptr = (int*)malloc(sizeof(int)); // 为一个整型变量分配内存
if (ptr == NULL) {printf("内存分配失败\n");
} else {*ptr = 10;  // 使用分配的内存printf("%d\n", *ptr);
}
 
2. new(C++ 中的动态内存分配)
 
new 是 C++ 中的关键字,用于动态分配内存,它自动返回指向新分配内存的指针,并且会调用相应对象的构造函数。
语法:
type* pointer = new type;  // 分配一个类型为 type 的单个对象
type* pointer = new type[n];  // 分配一个类型为 type 的数组
 
- 直接使用 
new时,C++ 会自动计算内存大小并返回指向新分配对象的指针。 - 对于数组,
new[]会在分配内存时自动计算元素大小,并且可以存储数组的大小信息。 
代码实例:
int* ptr = new int;  // 为一个整数分配内存
*ptr = 10;  // 使用分配的内存
cout << *ptr << endl;int* arr = new int[5];  // 为一个包含 5 个整数的数组分配内存
arr[0] = 1;
arr[1] = 2;
cout << arr[0] << ", " << arr[1] << endl;
 
3. malloc() 与 new 的区别
 
虽然 malloc() 和 new 都用于动态分配内存,但它们之间有一些重要的区别:
| 特性 | malloc() (C 语言) | new (C++ 语言) | 
|---|---|---|
| 返回值 | 返回 void*,需要强制类型转换为目标类型的指针 | 返回目标类型的指针,无需类型转换 | 
| 内存初始化 | 不初始化内存,分配的内存内容是未定义的 | 自动初始化(如果是基本类型的话,通常是未定义的;如果是对象类型,会调用构造函数) | 
| 类型安全 | 返回 void*,需要进行类型转换 | 返回目标类型指针,类型安全 | 
| 调用构造函数 | 不会调用对象的构造函数 | 会调用对象的构造函数 | 
| 数组分配 | 需要手动计算数组元素的大小 | new[] 会自动计算数组的总大小 | 
| 内存释放 | 使用 free() 来释放内存 | 使用 delete 或 delete[] 来释放内存 | 
4. malloc() 的不足
 
-  
不调用构造函数:
malloc()只负责分配内存,而不会初始化内存空间,也不会调用对象的构造函数。对于复杂类型(如类对象),这可能会导致问题。 -  
无法自动释放内存:
malloc()分配的内存需要通过free()手动释放。如果忘记释放内存,会导致内存泄漏。 -  
类型不安全:
malloc()返回的是void*类型,需要强制转换为目标类型指针,容易出现类型不匹配的问题。 
5. new 的优势
 
-  
类型安全:
new返回的是目标类型的指针,无需强制类型转换。 -  
调用构造函数:
new不仅分配内存,还会调用对象的构造函数初始化对象(如果是类类型的话)。 -  
自动管理内存:C++ 引入了
delete和delete[],可以安全地释放通过new分配的内存,避免内存泄漏。 
6. free() 与 delete 的区别
 
-  
free():malloc()和calloc()分配的内存需要使用free()来释放。 -  
delete:new分配的内存需要使用delete来释放。如果是数组,使用delete[]。 
例子:
int* ptr = new int; // 分配内存
delete ptr;         // 释放内存int* arr = new int[5]; // 分配数组
delete[] arr;          // 释放数组
 
总结:
malloc()是 C 语言中的内存分配函数,不会初始化内存,也不会调用构造函数。new是 C++ 中的内存分配操作符,会返回一个类型安全的指针,并且会调用构造函数初始化内存。malloc()与new的使用场景有所不同,在 C 语言中使用malloc(),而在 C++ 中推荐使用new。
  
