malloc和new的异同
时间: 2024-05-24 10:08:52 浏览: 125
malloc和new都是用于在程序运行时动态分配内存空间的函数。它们的主要区别如下:
1. 语法不同:malloc是C标准库函数,需要使用头文件stdlib.h,语法为void *malloc(size_t size);new是C++运算符,语法为new Type[size]或new Type。
2. 返回值类型不同:malloc返回void类型指针,需要通过类型转换将其转换成需要的指针类型;new返回指定类型的指针,不需要进行类型转换。
3. 内存分配失败时的处理不同:malloc在内存分配失败时返回NULL,需要检查返回值是否为NULL来判断内存分配是否成功;new在内存分配失败时会抛出std::bad_alloc异常。
4. 内存释放方法不同:malloc分配的内存需要使用free()函数手动释放;new分配的内存可以使用delete运算符进行释放,也可以使用delete[]运算符释放数组。
5. 对象构造和初始化方式不同:new运算符会自动调用对象的构造函数,对对象进行初始化;malloc只会分配内存空间,不会对对象进行初始化。
相关问题
new和malloc的异同
new和malloc都是用于在内存中分配空间的方法,但它们有以下几点异同:
1. 用法不同:
- new是C++中的运算符,用于动态分配内存并调用对象的构造函数进行初始化。使用new时,需要指定要分配的类型,并返回指向该类型的指针。
- malloc是C语言中的函数,用于动态分配内存,但不会调用对象的构造函数进行初始化。使用malloc时,需要指定要分配的字节数,并返回void指针。
2. 内存大小计算方式不同:
- new根据类型自动计算所需的内存大小,无需显式指定字节数。
- malloc需要显式指定要分配的字节数。
3. 错误处理方式不同:
- new在分配内存失败时会抛出std::bad_alloc异常。
- malloc在分配内存失败时返回NULL。
4. 对象构造和析构的处理方式不同:
- new会自动调用对象的构造函数进行初始化,并在对象不再使用时自动调用析构函数进行清理。
- malloc只是分配了一块内存空间,并不会调用对象的构造函数和析构函数,需要手动进行初始化和清理。
5. 返回值类型不同:
- new返回指向分配的对象的指针。
- malloc返回void指针,需要进行类型转换后才能使用。
new和malloc的异同和删除
new和malloc都是内存管理函数,它们在C++和C语言中用于动态分配内存,但有一些关键的不同点:
1. **新 (new)**: C++特有的关键字,它不仅分配内存,还自动调用构造函数创建对象实例。例如 `int* p = new int;` 分配了一个整数类型的内存并调用了默认构造函数。当不再需要这个对象时,应该使用`delete`释放内存,并确保调用析构函数。
```cpp
delete p;
```
2. **malloc()**: C语言的标准库函数,只负责分配内存,不包含构造或析构操作。使用malloc分配的对象需要手动调用相应类型的构造函数(如`::operator new()`),以及`free()`来释放内存:
```c
int* p = malloc(sizeof(int));
if (p) {
// 调用构造函数
p = ::operator new(sizeof(int), p);
// 使用完后
free(p);
}
```
3. **构造与析构**:
- `new`自动执行构造,`delete`会调用析构。
- `malloc`需要用户手动处理构造和析构,如果忘记,则可能导致资源泄漏。
4. **异常安全性**:
- C++的`new`在分配失败时会产生运行时错误。
- C的`malloc`则不会,如果失败通常返回NULL,程序员需要自行检查。
5. **内存对齐**:
- C++使用标准库的内存对齐规则,`new`会保证对象的内存对齐。
- C的`malloc`则不一定,需要用户额外处理。
关于删除:
- 对于C++的`new`分配的对象,使用`delete`进行释放。
- 对于C的`malloc`分配的内存,使用`free`释放。
阅读全文