学懂C++ (十五):高级教程——搞懂new/delete和malloc/free的区别

server/2024/10/18 18:28:13/

在C++中,new/deletemalloc/free都是用于动态内存分配和释放的操作,但它们有显著的区别。这些区别主要体现在内存分配方式、内存初始化、类型安全以及对象的构造和析构等方面。

new 和 delete

new 运算符
  • 类型安全:new运算符会根据指定类型自动计算所需的内存大小,并返回一个正确类型的指针。
  • 调用构造函数:如果为对象分配内存,new会调用该对象的构造函数进行初始化。
  • 语法简洁:例如 Type* ptr = new Type; 直接分配并返回类型为 Type 的指针。
delete 运算符
  • 调用析构函数:如果释放的是对象内存,delete会调用该对象的析构函数。
  • 类型安全:delete运算符接受一个指针,并释放该指针指向的内存,不需要显式指定内存大小。

malloc 和 free

malloc 函数
  • 无类型安全:malloc函数返回 void* 类型的指针,需要进行显式类型转换。
  • 不调用构造函数:malloc只分配内存,不会调用对象的构造函数进行初始化。
  • 用于C语言:malloc属于标准C库函数,在C++中仍然可用,但不推荐使用。
free 函数
  • 不调用析构函数:free函数只释放内存,不会调用对象的析构函数。
  • 类型不安全:free需要显式传递指针,并且无法确定指针类型。

具体区别

1. 类型安全
  • new:返回的是指定类型的指针,不需要进行类型转换。
    int* p = new int; // 自动知道是int类型指针
  • malloc:返回的是 void*,需要显式转换。
    int* p = (int*)malloc(sizeof(int));
2. 构造和析构
  • new:会调用对象的构造函数。

    class MyClass {
    public:MyClass() { cout << "Constructor called" << endl; }
    };MyClass* obj = new MyClass(); // 调用构造函数
    
  • delete:会调用对象的析构函数。

    delete obj; // 调用析构函数
  • malloc:不会调用对象的构造函数。

    MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // 不会调用构造函数
  • free:不会调用对象的析构函数。

    free(obj); // 不会调用析构函数
    3. 内存分配方式
  • new:使用C++的运算符来分配内存。

    int* p = new int[10]; // 分配int类型数组
  • malloc:使用C标准库函数来分配内存。

    int* p = (int*)malloc(10 * sizeof(int));

 

4. 释放内存
  • delete:用于释放通过 new 分配的内存。

    delete p; // 释放单个对象 
    delete[] p; // 释放数组
  • free:用于释放通过 malloc 分配的内存。

    free(p);

示例对比

使用 new 和 delete
#include <iostream>
using namespace std;class MyClass {
public:MyClass() { cout << "Constructor called" << endl; }~MyClass() { cout << "Destructor called" << endl; }
};int main() {MyClass* obj = new MyClass(); // 调用构造函数delete obj; // 调用析构函数int* arr = new int[10]; // 动态分配数组delete[] arr; // 释放数组内存return 0;
}

 使用 malloc 和 free

#include <iostream>
#include <cstdlib> // 包含malloc和free
using namespace std;class MyClass {
public:MyClass() { cout << "Constructor called" << endl; }~MyClass() { cout << "Destructor called" << endl; }
};int main() {MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // 不调用构造函数free(obj); // 不调用析构函数int* arr = (int*)malloc(10 * sizeof(int)); // 动态分配数组free(arr); // 释放数组内存return 0;
}

总结

  • new/delete:类型安全,支持调用构造函数和析构函数,适用于C++中的对象和数组的动态内存分配。
  • malloc/free:无类型安全,不调用构造函数和析构函数,主要用于C语言,在C++中不推荐使用。

http://www.ppmy.cn/server/98366.html

相关文章

最新版的AutoGPT,我搭建好了

最近AutoGPT不是更新了嘛 安装 我按照官方的教程 在本地搭建好了 改动 可见的改动&#xff0c;主要是把原来的纯命令行改成前后端的形式 看下前端界面 界面比较简单&#xff0c;主要分3个大块 监控 第一个是监控 主要是看你在 build 里构建的Agents的运行情况 build 第一个是Ag…

春秋云境 | 文件上传 | CVE-2022-30887

目录 靶标介绍 开启靶场 上传一句话木马 蚁剑连接 找到 flag 靶标介绍 多语言药房管理系统 (MPMS) 是用 PHP 和 MySQL 开发的, 该软件的主要目的是在药房和客户之间提供一套接口&#xff0c;客户是该软件的主要用户。该软件有助于为药房业务创建一个综合数据库&#xff0…

怎样确定局域网里面是否有MAC地址冲突

目录 MAC地址冲突的现象1. 网络连接不稳定2. 数据包丢失3. 网络性能下降4. 无法访问特定设备5. 网络诊断工具的异常结果6. 网络安全问题 确定MAC地址冲突的方法如何解决MAC地址冲突总结 MAC地址冲突 是指在同一局域网&#xff08;LAN&#xff09;中&#xff0c;两个或多个设备具…

[Day 47] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈中的數據一致性問題 引言 區塊鏈技術因其去中心化和不可篡改的特性&#xff0c;在金融、供應鏈、醫療等領域得到了廣泛應用。然而&#xff0c;隨著區塊鏈技術的廣泛應用&#xff0c;數據一致性問題成為了一個重要的挑戰。數據一致性是指在多個節點之間保持數據的一致性…

Go语言 结构体

本文主要为Go语言 结构体介绍、语法、使用注意及其示例。 目录 结构体 语法 语法示例 语法说明 声明使用 创建并赋值 使用指针 使用注意 总结 结构体 C语言里面&#xff0c;我们可以使用typedef in MyInt。 在go语言中使用结构体来模拟类&#xff0c;使用type stru…

UCOSIII的任务管理详解

前言 对于操作系统而言&#xff0c;最重要的就是任务的创建、挂起、删除和调度等&#xff0c;简单的创建任务可能大家都会&#xff0c;但是做大型项目的话&#xff0c;任务多了就可能需要对UCOSIII的任务管理做更深层次的一些理解。 一、任务状态 UCOSIII是单核系统&#xff…

猎码安卓APP开发IDE,amix STUDIO中文java,HTML5开发工具

【无爱也能发电】Xili 2024/8/2 10:41:20 猎码安卓APP开发IDE,amix java开发工具 我研发这些只有一小部分理由是为了赚钱&#xff0c;更多是想成就牛逼的技术产品。 目前的产品就够我赚钱的&#xff0c;我持续更新就好了&#xff0c;没必要继续研究。 IDE不赚钱&#xff0c;谁…

寻参算法之人工蜂群算法

人工蜂群算法&#xff08;Artificial Bee Colony, ABC&#xff09; 来历 人工蜂群算法&#xff08;Artificial Bee Colony, ABC&#xff09;由Dervis Karaboga在2005年提出。该算法受到蜜蜂觅食行为的启发&#xff0c;通过模拟蜜蜂在寻找食物过程中的探索和开发行为&#xff…