C++中的new、malloc、realloc、calloc——特点?函数原型?释放方式?区别?校招面试常问内容?

作者:求一个demo

版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

内容通俗易懂,没有废话,文章最后是面试常问内容(建议通过标题目录学习)

废话不多说,我们直接开始------>>>>>>

一、new

        1、功能:

        (1)new:动态分配堆区内存,并调用对象的构造函数。

        (2)delete:释放内存,并调用对象的析构函数。

        2、特点:

        ①是C++的操作符,支持面向对象特性(如构造和析构)。

        ②无需手动计算内存大小(编译期自动计算)。

        ③可以重载(类级别或全局级别)。

        ④失败时抛出std::bad_alloc异常(除非使用nothrow版本)。

        3、基本语法:

T* p = new T;          // 分配单个对象(默认构造)
T* p = new T(args...); // 分配并带参数构造
T* arr = new T[N];     // 分配数组(N 个对象)

        4、示例:

int* p = new int(42);  // 分配一个 int 并初始化为 42
delete p;              // 释放内存// 数组版本
int* arr = new int[10]; // 分配 10 个 int
delete[] arr;           // 释放数组

二、malloc

        1、功能:在堆区申请指定字节数 且未初始化的内存。

        2、特点:

        ①是C库函数,不会调用构造函数和析构函数。

        ②需要手动计算内存大小(使用sizeof)。

        ③失败时返回NULL。

        ④与free配对使用释放内存。

        ⑤malloc初始化的堆内存通过memset等函数进行初始化(memset将一段内存初始化为一个指定值。void* memset(void *s,int c,size_t n),s为指向的那个内存块,c为设置的初始值,n为要被设置该值的字节数)。

        3、函数原型:

#include <cstdlib> // 或 <stdlib.h>
void* malloc(size_t size);
//size要分配的字节数(通常用sizeof计算)。

        4、示例:

int* p = (int*)malloc(sizeof(int)); // 分配一个 int
free(p);                            // 释放内存// 数组版本
int* arr = (int*)malloc(10 * sizeof(int)); // 分配 10 个 int
free(arr);

三、realloc

        1、功能:调整已分配内存块的大小(扩大或缩小)。

        2、特点:

        ①可能移动内存到新地址(原内容保留:先在ptr指向内存的起始地址往后扩展找newsize的空间(ptr是malloc申请的空间)。如果先前空间往后找不能满足大小,那就去堆区别的空间找newsize大小内存,然后将之前数据拷贝到这个新内存里。原来的空间会自动释放,不需要手动释放,新的空间用完需要自己free手动释放。)。

        ②若第一个参数为NULL,则等价于malloc。

        ③失败时返回NULL(原内存块仍有效)。

        3、函数原型:

#include <cstdlib>
void* realloc(void* ptr, size_t new_size);
//ptr原内存指针(可为NULL,此时等价于malloc);
//new_size新的大小(字节数)。

        4、示例:

int* p = (int*)malloc(10 * sizeof(int));
p = (int*)realloc(p, 20 * sizeof(int)); // 扩容到 20 个 int
free(p);

四、calloc

        1、功能:分配内存,并将所有字节初始化为0。

        2、特点:

        ①参数为元素数量和每个元素的大小。

        ②适合分配数组和结构体。

        ③与free配对使用 释放内存。

        3、函数原型:

#include <cstdlib>
void* calloc(size_t num, size_t size);
//num元素数量;
//size每个元素的字节数。

        4、示例:

int* p = (int*)calloc(1, sizeof(int)); // 分配并初始化为 0
int* arr = (int*)calloc(10, sizeof(int)); // 分配 10 个 int(全部为 0)
free(p);
free(arr);

五、区别(new、malloc、realloc、calloc)

        ①来源上:new来自C++原生;malloc、realloc、calloc都来自C库。

        ②初始化内存:new调用构造函数;malloc未初始化;calloc初始化为0;realloc保留原内容。

        ③释放方式:new通过delete/delete[]释放;malloc、realloc和calloc通过free释放。

        ④失败行为:new抛出异常;malloc、realloc、calloc返回NULL。

        ⑤计算大小:new自动计算(sizeof);malloc、realloc、calloc手动计算(sizeof)。

        ⑥适用场景:new适用于C++对象;malloc适用于原始内存;calloc适用于需要清零的内存;realloc适用于调整内存大小。

六、校招面试常问内容

1、new和malloc的区别?

        ①new是操作符,而malloc是函数。
        ②new在调用的时候先分配内存,再调用构造函数,释放的时候调用析构函数;而malloc没有构造和析构。
        ③malloc需要给定申请内存的大小,返回的指针需要强转;new会调用构造函数,不用指定内存的大小,返回指针不用强转,malloc默认的返回类型是void*。
        ④new可以被重载,malloc不行。
        ⑤new分配内存更加直接安全。(new在分配内存的同时会调用对象的构造函数进行初始化,‌在释放内存时会调用对象的析构函数进行清理工作。‌这确保了对象的正确初始化和资源清理,‌避免了资源泄漏和其他潜在问题。‌而malloc分配的内存只是一块原始的字节空间,‌不会自动调用对象的构造函数或析构函数)。
        ⑥new发生错误抛出异常,malloc返回null。

2、malloc和calloc的区别?

        ①calloc将分配的内存初始化为0,malloc分配内存不初始化。

        ②calloc接收元素数量和元素大小,malloc直接接收总字节数。

        ③calloc因初始化可能比malloc慢,但安全性更高(避免使用未初始化内存等)。

3、realloc工作原理?

        ①若realloc失败,原指针仍然有效,需要手动free释放。

        ②realloc第一个参数若为NULL,则等价于malloc。

        ③缩小时可能会直接截断内存,多余的内存不一定释放(如果需要释放,可以先分配一个合适大小的内存块,将原内存块中的数据复制到新内存块中,然后释放原内存块)。

4、内存泄漏与野指针如何避免?

        (1)内存泄漏避免:

        ①使用智能指针。

        ②遵循RAII原则(构造函数获取资源,析构函数释放资源)。

        ③工具检测(Valgrind)。

        (2)野指针避免:

        ①free之后置空。

        ②使用智能指针。

        ③工具检测(Valgrind)。

最后,如有不足和错误的地方,期待私信指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/43865.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【字符设备驱动开发–IMX6ULL】(一)简介

【字符设备驱动开发–IMX6ULL】&#xff08;一&#xff09;简介 一、Linux驱动与裸机开发区别 1.裸机驱动开发回顾 ​ 1、底层&#xff0c;跟寄存器打交道&#xff0c;有些MCU提供了库。 spi.c&#xff1a;主机驱动&#xff08;换成任何一个设备之后只需要调用此文件里面的…

Spring AI MCP 架构详解

Spring AI MCP 架构详解 1.什么是MCP? MCP 是一种开放协议&#xff0c;它对应用程序向大语言模型&#xff08;LLMs&#xff09;提供上下文信息的方式进行了标准化。可以把 MCP 想象成人工智能应用程序的 USB-C 接口。就像 USB-C 为将设备连接到各种外围设备和配件提供了一种…

【Java】IO流

一、IO流的定义 二、 字节流 &#xff08;一&#xff09;FileOutputStream 操作本地文件的字节输出流&#xff0c;可以把程序中的数据写到本地文件中。 1、书写步骤 注&#xff1a; &#xff08;1&#xff09;创建字节输出流对象&#xff1a; 参数是字符串表示的路径或者…

Java 大视界 -- Java 大数据机器学习模型在电商商品推荐冷启动问题中的解决策略(160)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

MySQL———作业实验

一、创建数据库表 1.创建数据库 mysql> create database mydb11_stu; mysql> use mydb11_stu; 2.建表 &#xff08;1&#xff09;创建student表 mysql> create table student ( -> id int(10) not null unique primary key, -> name varch…

深度解析衡石科技HENGSHI SENSE嵌入式分析能力:如何实现3天快速集成

嵌入式分析成为现代SaaS的核心竞争力 在当今SaaS市场竞争中&#xff0c;数据分析能力已成为产品差异化的关键因素。根据Bessemer Venture Partners的最新调研&#xff0c;拥有深度嵌入式分析功能的SaaS产品&#xff0c;其客户留存率比行业平均水平高出23%&#xff0c;ARR增长速…

Day17 -实例:利用不同语言不同框架的特征 进行识别

前置&#xff1a;我们所需的web站点&#xff0c;都可以利用fofa去搜索&#xff0c;例如&#xff1a;app"flask"这样的语句去找对应的站点&#xff0c;找到后&#xff0c;我们模拟不知道是什么框架&#xff0c;再根据特征去判断它的框架。 ***利用工具可以再去结合大…

Linux输入系统应用编程

什么是输入系统 Linux 输入系统是处理用户输入设备(如键盘、鼠标、触摸屏、游戏手柄等)的软件架构。在应用编程层面&#xff0c;它提供了与这些输入设备交互的接口。 主要组成部分 输入设备驱动层&#xff1a;直接与硬件交互的驱动程序 输入核心层&#xff1a;内核中的输入子…

【C++初阶】---类和对象(下)

1.再探构造函数&#xff08;初始化链表&#xff09; •之前我们实现构造函数时&#xff0c;初始化成员变量主要使⽤函数体内赋值&#xff0c;构造函数初始化还有⼀种⽅式&#xff0c;就是初始化列表&#xff0c;初始化列表的使⽤⽅式是以⼀个冒号开始&#xff0c;接着是⼀个以逗…

Ubuntu 22.04.5 LTS 设置时间同步 ntp

提示&#xff1a;文章为操作记录&#xff0c;以备下次使用 文章目录 前言一、设置ntp1.1替换国内源1.2 更新源&安装1.3 验证 前言 设置时间同步&#xff0c;环境版本 # cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.5 LTS" NAME"Ubuntu" VERSION_…

飞书电子表格自建应用

背景 coze官方的插件不支持更多的飞书电子表格操作&#xff0c;因为需要自建应用 飞书创建文件夹 创建应用 开发者后台 - 飞书开放平台 添加机器人 添加权限 创建群 添加刚刚创建的机器人到群里 文件夹邀请群 创建好后&#xff0c;就可以拿到id和key 参考教程&#xff1a; 创…

计算机网络——传输层(TCP)

传输层 在计算机网络中&#xff0c;传输层是将数据向上向下传输的一个重要的层面&#xff0c;其中传输层中有两个协议&#xff0c;TCP&#xff0c;UDP 这两个协议。 TCP 话不多说&#xff0c;我们直接来看协议报头。 源/目的端口号&#xff1a;表示数据从哪个进程来&#xff0…

【ArcGIS】ArcGIS10.6彻底卸载和ArcGIS10.2安装全过程

卸载python3后,解决了ArcGIS与python3冲突问题后,软件可以正常打开使用了 但是还是出现了问题 用ArcGIS 进行空间分析时,中间操作没有任何报错和问题,但是就是没有运行结果 在别人的软件上操作一遍可以出现运行结果 关闭确有这个,但真的不是我给它的运行时间不够,反反复复试…

智慧电力:点亮未来能源世界的钥匙

在科技日新月异的今天&#xff0c;电力行业正经历着前所未有的变革。智慧电力&#xff0c;作为这一变革的核心驱动力&#xff0c;正逐步改变着我们对电力的认知和使用方式。它不仅是电力行业的一次技术革新&#xff0c;更是推动社会可持续发展、实现能源高效利用的重要途径。 智…

oracle中java类的使用

方式一&#xff1a; 编写一个简单的java类 vi OracleJavaDemo.java public class OracleJavaDemo { public static String processData(String input) { return "Processed: " input; } } 编译 javac OracleJavaDemo.java 生成OracleJavaDemo…

pycharm2024.1.1版本_jihuo

目录 前置&#xff1a; 步骤&#xff1a; step one 下载软件 step two 卸载旧版本 1 卸载软件 2 清除残余 step three 下载补丁 step four 安装2024.1.1版本软件 step five 安装补丁 1 找位置放补丁 2 自动设置环境变量 step six 输入jihuo码 前置&#xff1a; 之…

革新汽车安全通信技术,美格智能全系车载通信模组支持NG-eCall

根据QYR&#xff08;恒州博智&#xff09;的统计及预测&#xff0c;2024年全球汽车无线紧急呼叫&#xff08;eCall&#xff09;设备市场销售额达到了25.17亿美元&#xff0c;预计2031年将达到44.97亿美元&#xff0c;年复合增长率&#xff08;CAGR 2025-2031&#xff09;为8.8%…

AWE 2025:当AI科技遇见智能家居

3月20日&#xff0c;以“AI科技、AI生活”为主题的AWE2025&#xff08;中国家电及消费电子博览会&#xff09;在上海新国际博览中心开幕。作为全球家电行业风向标&#xff0c;本届展会最大的亮点莫过于健康理念在家电领域的全面渗透。从食材保鲜到空气净化&#xff0c;从衣物清…

《Spring Cloud Eureka 高可用集群实战:从零构建高可靠性的微服务注册中心》

从零构建高可用 Eureka 集群 | Spring Cloud 微服务架构深度实践指南 本文核心内容基于《Spring Cloud 微服务架构开发》第1版整理&#xff0c;结合生产级实践经验优化 实验环境&#xff1a;IntelliJ IDEA 2024 | JDK 1.8| Spring Boot 2.1.7.RELEASE | Spring Cloud Greenwich…

蓝桥杯[每日一题] 真题:管道(java版)

题目描述 有一根长度为 len 的横向的管道&#xff0c;该管道按照单位长度分为 len 段&#xff0c;每一段的中央有一个可开关的阀门和一个检测水流的传感器。一开始管道是空的&#xff0c;位于 Li 的阀门会在 Si 时刻打开&#xff0c;并不断让水流入管道。 对于位于 Li 的阀门&a…