【C++】---内存管理new和delete详解,C++中的内存管理,new与delete详解

马肤

温馨提示:这篇文章已超过411天没有更新,请注意相关的内容是否还可用!

摘要:本文详细探讨了C++中的内存管理,重点介绍了new和delete操作符的使用。文章阐述了new如何动态分配内存,以及delete如何释放这些内存。也讨论了与内存管理相关的一些重要概念,如指针和引用。本文旨在帮助开发者更好地理解和使用C++的内存管理机制,以提高代码效率和避免潜在问题。

C/C++内存分布

C/C++内存被分为6个区域:

1、内核空间:存放内核代码和环境变量。

2、栈区:向下增长,用于存放非静态局部变量、函数参数、返回值等。

【C++】---内存管理new和delete详解,C++中的内存管理,new与delete详解 第1张

3、内存映射段:包含文件映射、匿名映射、动态库等。

4、堆区:向上增长,用于程序运行时动态内存的分配。

5、数据段(静态区/全局域):存放全局变量和静态变量。

6、代码段(常量区):存放可读代码和只读常量。

下面是一段示例代码,关于变量在内存中的位置:

【C++】---内存管理new和delete详解,C++中的内存管理,new与delete详解 第2张

int globalVar = 1; // 在数据段(静态区/全局域)
static int staticGlobalVar = 1; // 在数据段(静态区/全局域)
void Test() {
    static int staticVar = 1; // 在栈区(静态变量在栈区)
    int localVar = 1; // 在栈区(局部变量)
    int num1[10] = { 1, 2, 3, 4 }; // 在栈区(局部变量数组)
    char char2[] = "abcd"; // 在栈区(局部变量数组),存储字符串常量"abcd"的副本
    const char* pChar3 = "abcd"; // pChar3指针在栈区,它所指向的字符串常量"abcd"在常量区
    int* ptr1 = (int*)malloc(sizeof(int) * 4); // ptr1指针在栈区,它所指向的内存块在堆区
    int* ptr2 = (int*)calloc(4, sizeof(int)); // 同上
    int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4); // 同上
    free(ptr1); // 释放堆区内存
    free(ptr3); // 释放堆区内存
}

选择题答案:

globalVar在数据段(静态区/全局域)。

staticGlobalVar在数据段(静态区/全局域)。

staticVar在栈区(因为它是Test函数内的静态变量)。

localVar在栈区(因为它是局部变量)。

【C++】---内存管理new和delete详解,C++中的内存管理,new与delete详解 第3张

num1在栈区(因为它是局部变量数组)。

char2在栈区(存储字符串常量"abcd"的副本)。

*char2指向的字符串常量"abcd"在常量区。

pChar3在栈区(它是一个指针变量)。

*pChar3指向的字符串常量"abcd"在常量区。

【C++】---内存管理new和delete详解,C++中的内存管理,new与delete详解 第4张

ptr1在栈区(它是一个指针变量)。

*ptr1指向的内存块在堆区。

关于sizeof和strlen的区别:

sizeof(ch2)=5,因为char数组末尾还有一个''字符,strlen(ch2)=4,因为strlen函数计算的是字符串的实际长度,不包括''字符,对于指针变量,sizeof返回的是指针本身的大小(通常为4或8字节),而strlen计算的是指针所指向字符串的长度,对于动态分配的指针变量如ptr1,*ptr1指向的内存块大小由malloc/calloc等函数决定,而该内存块中存储的字符串长度可以通过strlen计算,关于char2、pchar3和ptr1的解释已在文中给出,关于使用new和delete的原因以及C++动态管理内存的方式,将在下文详细解释,二、C/C++使用new和delete的原因New和delete是C++中用于向内存申请空间和释放空间的操作符,相较于C语言中使用malloc、calloc、realloc和free来管理内存,C++的new和delete更加便捷和安全,使用new和delete的原因如下1. 使用C语言的malloc等函数需要手动计算申请的字节大小,而new和delete可以自动计算所需大小,2. 使用malloc等函数申请的内存需要进行强制类型转换才能解引用,而new和delete可以直接解引用,3. 使用malloc等函数申请内存后需要手动检查是否申请成功,而new在申请失败时会抛出异常,无需手动检查,4. new和delete不仅适用于内置类型,还适用于自定义类型,对于自定义类型,new会调用构造函数进行对象初始化,delete会调用析构函数进行资源清理,三. C++动态管理内存的方式C++中动态管理内存主要通过以下几种方式:使用new和delete操作符:new用于动态分配内存,delete用于释放内存,注意:申请和释放单个空间时使用new和delete,申请和释放多个空间时使用new[]和delete[],New的特点包括能够自动计算所需大小、支持自定义类型的初始化以及申请失败时会抛出异常等。


0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码