new/delete 和 malloc/free 都是C/C++中用于动态内存管理的机制
但它们之间存在一些关键区别:
1. 语法和使用方式
-
new/delete:new是一个运算符,用来分配内存并调用对象的构造函数。delete也是运算符,它会先调用对象的析构函数,然后释放内存。- 它们主要用于类的对象,也可以用于基本数据类型。
-
malloc/free:malloc是一个标准库函数,用来分配指定大小的内存块,返回指向该内存块的指针。free也是一个标准库函数,用来释放由malloc(或calloc,realloc)分配的内存。- 它们不调用任何构造函数或析构函数,适用于非对象类型的内存分配,也可用于原始数据类型的数组。
2. 构造与析构
new/delete自动处理对象的构造和析构。malloc/free不处理构造和析构,这意味着你需要手动初始化分配的内存,并且在释放之前没有自动清理操作。
3. 返回类型
new返回的是所创建对象的类型的指针。malloc总是返回void*,需要显式地转换为适当的指针类型。
4. 失败时的行为
new在无法分配足够的内存时,默认情况下会抛出std::bad_alloc异常。malloc在失败时返回NULL,不会抛出异常,需要手动排查空指针问题。
5. 内存对齐
new保证按照对象的要求进行正确的内存对齐。malloc通常也会正确对齐内存,但这依赖于具体的实现。
6. 使用场景
new/delete更适合于C++代码,因为它们更符合面向对象编程的原则。malloc/free来自C语言,虽然在C++中也可以使用,但在C++中通常推荐使用new/delete。
7. 数组分配
new可以通过new[]分配数组,并通过delete[]释放数组。malloc分配的数组需要通过计算所需的总字节数来确定大小,而free不区分是否为数组。
总的来说,在C++中,new/delete 提供了更加类型安全和面向对象的方式来管理内存,而 malloc/free 则提供了更底层的控制。在现代C++编程中,推荐使用 new/delete 或者更好的智能指针(如 std::unique_ptr 和 std::shared_ptr),以及容器(如 std::vector)来管理动态内存,以减少内存泄漏和其他潜在的问题。

被折叠的 条评论
为什么被折叠?



