当前位置: 首页 > news >正文

C++面试宝典 01 new/delete/malloc/free关系

前言:
本教程旨在提取最精炼、实用的C++面试知识点,供读者快速学习及本人查阅复习所用。本文配套《C++面试宝典》已整理,免费领取地址:https://pan.quark.cn/s/c991f40d40a7

  • 一、new、delete、malloc、free之间的关系
    • 1.核心关系与区别
      特性 new/delete malloc/free
      语言归属 C++ C语言/C++
      内存分配类型 对象(含构造函数调用) 原始内存块(不调用构造函数)
      内存释放类型 对象(含析构函数调用) 原始内存块(不调用析构函数)
      参数类型        自动推导大小 需要指定内存大小(size_t)
    • 2.new与delete(C++对象管理)
      new:
              多态分配对象内存,并调用对象的构造函数
      语法:
              指针=new类型;或指针=new类型(构造参数);
      示例:
#include <iostream>class MyClass {public:
    MyClass() { std::cout << "构造函数调用\n"; }
    ~MyClass() { std::cout << "析构函数调用\n"; }
};
int main() {
    MyClass* obj = new MyClass(); // 分配内存并调用构造函数
    delete obj;                   // 释放内存并调用析构函数
    return 0;
}

输出结果:
构造函数调用
析构函数调用
delete:
        释放new分配的对象内存,并调用对象的析构函数
        注意:若忘记调用delete,会导致内存泄漏
image

    • 3.malloc与free(原始内存管理)
      malloc:
              分配指定大小的原始内存块,不调用构造函数
      语法:指针=(类型*)malloc(字节数);
#include <iostream>#include <cstdlib> // 包含malloc/free
class MyClass {public:
    MyClass() { std::cout << "构造函数调用\n"; }
    ~MyClass() { std::cout << "析构函数调用\n"; }
};
int main() {
    MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // 仅分配内存
    free(obj); // 仅释放内存,不调用析构函数
    return 0;
}

输出:(无输出,因为不调用构造跟析构函数)
free:
        释放malloc分配的内存,不会调用析构函数
风险:若对象包含资源(如文件句柄、动态数组),未调用析构函数会导致资源泄漏

    • 4.注意事项
      4.1构造函数与析构函数
              new/delete会调用构造函数与析构函数
              malloc/free仅管理内存,不涉及对象生命周期
      4.2类型安全
              new自动推导类型大小,无需计算
              malloc要手动指定字节数
      4.3
              C++中优先使用new/delete
              避免混用new/malloc和delete/free
http://www.hskmm.com/?act=detail&tid=19973

相关文章:

  • Ansible + Docker 部署 MinIO 集群
  • ​​万用表与电流探头测量电流信号的技术对比分析​​
  • flink运行时架构 - --
  • k8s命令
  • wifi亮灭屏机制--系统修改
  • 自动遍历测试利器:开源工具AppCrawler 配置全解析
  • 得帆云ETL全新版本升级驱动数据高效流转
  • Windows 的图标没有及时更新
  • 拒绝 “能源糊涂账”!MyEMS 如何让中小企业能耗管理 “秒上手”?
  • 【海内外多个支持单位|学生优惠|高录用快见刊】第五届管理科学和软件工程国际学术会议(ICMSSE 2025)
  • 电天下dq123.com搜索功能全新升级,AI加持,焕新垂直行业搜索体验!
  • 中小微企业能源管理 “入门神器”:MyEMS 开源系统如何低成本实现专业级管控?
  • jinja2和角色管理和集合
  • 挖同行墙脚!有稳定供应商的客户怎么下手构建?
  • 视频融合平台EasyCVR在智慧工地中的应用:构建安全、智能、高效的“云上工地”
  • 开源技术崛起:中国如何构建数字经济时代的创新基础设施
  • 250928
  • 地图商业授权共享 - no
  • DevOps平台选型指南:数字化转型中的技术决策关键
  • window 安全模式卸载任何软件
  • 题解:qoj1261 Inv
  • sv 去除字符串行尾空格函数
  • 题解:AT_abc214_g [ABC214G] Three Permutations
  • 通过velocity将增量发版的代码及文件生成生成一个linux shell文件(解放运维)
  • 从企业级项目到普惠API:我如何将自研的人脸识别引擎打造成「识度AI」
  • 得帆AI aPaaS 1.0正式发布,低代码+AI关键特性等你探索
  • 配置驱动的动态 Agent 架构网络:实现高效编排、动态更新与智能治理
  • NVIDIA Dynamo深度解析:如何优雅地解决LLM推理中的KV缓存瓶颈 - 实践
  • 完整教程:二十一、DevOps:从零建设基于K8s的DevOps平台(二)
  • 心跳交换机故障导致节号与数据库实例号不一致