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

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.dtcms.com/a/98839.html

相关文章:

  • 中断管理常用API(四)
  • 马斯克:1130 亿美元的操作,X 网友:有点感觉被卖了…
  • 基于烟花算法(Fireworks Algorithm,FWA)及三次样条的机器人路径规划,50个场景任意选择,完整MATLAB代码
  • C语言学习笔记(抱佛脚版)
  • MyBatis基础三(注解开发)
  • 迅为iTOP-RK3576人工智能开发板Android 系统接口功能测试
  • 一阶谓词逻辑表示法、产生式表示法、框架表示法深度对比
  • stack的详细介绍,queue的详细介绍
  • 转发和重定向的区别详解
  • Java的string默认值
  • ffuf:一款高效灵活的Web模糊测试利器
  • 右值和右值引用【C++】
  • onlyoffice 多核心研究
  • 763划分字母区间解题记录
  • java基础:常见类和对象
  • 游戏被外挂攻破?金融数据遭篡改?AI反作弊系统实战方案(代码+详细步骤)
  • Linux|gitlab|二进制快速安装部署gitlab-ce教程
  • 19_20 js es6
  • std::countr_zero
  • 模型苏醒计划:Threejs 让静态模型「叛逆」起来
  • Java.util.logging (JUL) 终极指南:从基础配置到高级玩法
  • 外观模式_结构型_GOF23
  • 游戏引擎学习第192天
  • 第三卷:覆舟山决战(73-108回)正反人物群像
  • 习题1.43
  • 软件工程面试题(十一)
  • 【数据结构】队列
  • el-radio-group 中 el-radio-button value未能绑定上数值数据
  • 欢乐力扣:合并两个有序链表
  • Redis6数据结构之List类型