【内存分布管理】new与malloc以及delede与delete[]的区别

文章目录

  • 1.内存分布示意图(重要)
  • 2.判断以下程序中的变量在什么区域
  • 3.new和delete
  • 4.malloc和new的区别
  • 5.内存泄漏
    • 内存泄漏的分类:
    • _CrtDumpMemoryLeaks() 函数
    • 如何避免内存泄漏

在这里插入图片描述

1.内存分布示意图(重要)

内存分布示意图
其中数据共享区也叫内存映射段,是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信

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";
 const char* pChar3 = "abcd";
 int* ptr1 = (int*)malloc(sizeof(int) * 4);
 int* ptr2 = (int*)calloc(4, sizeof(int));
 int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
 free(ptr1);
 free(ptr3);
}
  1. 选择题: 选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区) globalVar在哪里?C staticGlobalVar在哪里?C staticVar在哪里?_C localVar在哪里?A
    num1 在哪里?A
    char2在哪里?A *char2在哪里?A pChar3在哪里?A
    *pChar3在哪里?D ptr1在哪里?A *ptr1在哪里?B
  2. 填空题: sizeof(num1) = 40; (sizezof 数组名等于整个数组的大小) sizeof(char2) = 5__; strlen(char2) = 4; sizeof(pChar3) =
    4; strlen(pChar3) = 4; sizeof(ptr1) = 4;
  3. sizeof 和 strlen 区别? 答:sizeof 计算的是字节的大小,sizezof 数组名等于整个数组的大小strlen计算字符串的长度,遇到‘\0’为止

3.new和delete

new和delete是C++动态开辟与释放内存互相匹配的的两个操作符,因此不需要头文件。C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。
本质上,new的底层也是通过malloc来实现的

new与delete的使用示例

void Test()
{
  // 动态申请一个int类型的空间
  int* ptr4 = new int;
  
  // 动态申请一个int类型的空间并初始化为10
  int* ptr5 = new int(10);
  
  // 动态申请10个int类型的空间
  int* ptr6 = new int[3];
 
  delete ptr4;
  delete ptr5;
  delete[] ptr6;
}

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]使用的时候要互相匹配

4.malloc和new的区别

1.属性:new是关键字,而malloc是函数。
2.参数:new操作符会无需指定内存块的大小,编译器会自己根据类型算,而malloc需要显式的指定。
3.返回值类型:newc操作符申请成功时返回该对象类型的指针,无需强制转换,申请失败的时候会报异常。而malloc函数申请成功返回的时void*类型的指针,大多需要强制类型转换,申请失败会返回一个NULL.
4.new可以调用malloc来实现,但是malloc不可以。
5.对于自定义类型开辟空间
在这里插入图片描述
对于内置类型,new与malloc几乎没有什么区别,但是对于自定义类型,也就是class,new和delete会调用构造函数和析构函数.

5.delete和delete[]的区别

delete 释放new分配的单个对象指针指向的内存;
delete[] 释放new分配的对象数组指针指向的内存。

对于内置类型
delete和delete[]的效果是一样的

void test2() {
	int* a = new int[4];
	int* b = new int;
	delete[] a;
	delete b;
}

因为对于内置类型,在new分配内存的时候就已经确定了内存的大小,并且记录了下来, 系统可以记忆并且进行管理,在析构时,系统并不会调用析构函数
对于自定义类型:

void test3() {
	A* p1 = new A[5];
	//delete p1;错误
	delete[] p1;
}

delete与delete[]的效果是不一样的,delete只会调用一次析构函数,而delete[]会调用多次。那么delete[]是如何知道需要调用多少次析构函数呢?也就是如何知道对象数组的元素个数呢?
如果我们开辟了用new []开辟了对象数组,编译器会在数组的前面再开辟一块空间用来存放元素个数
在这里插入图片描述
在这里插入图片描述

此时如果用delete[]释放空间,它会先从上一块区域(32位系统是4字节,64位是8个字节)读取元素个数并释放
这也是为什么用delete 释放对象数组会报错误,因为deletet是从指针p1指向的位置开始,但是实际上p1上一面的内存块也要释放。动态内存不能只释放一部分

5.内存泄漏

内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误失去了对该段内存的控制,因而造成了内存的浪费。
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。

内存泄漏的分类:

堆内存泄漏(heap leak):
堆内存泄漏是指程序中通过new/malloc等申请到的堆空间没有及时用delete/free释放掉,导致这片空间无法再被申请。

系统内存泄漏
指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。

_CrtDumpMemoryLeaks() 函数

crtdbg模块的c++_CrtDumpMemoryLeaks函数可以检测C、C++代码中的内存泄漏错误。在需要检测的代码前后分别调用_CrtDumpMemoryLeaks函数,就可以看到该代码片段是否发送内存泄漏,以及泄露的空间大小,但是不能提供泄漏的具体地址。注意,要在进入调试窗口才能看到该信息。
在这里插入图片描述

如何避免内存泄漏

  1. 工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。
  2. 采用RAII思想或者智能指针来管理资源。
  3. 有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项。
  4. 使用内存泄漏工具检测。
    总结:
    1、事前预防型。如智能指针等。2、事后查错型。如泄漏检测工具。
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】成功解决ModuleNotFoundError: No module named ‘bs4‘

【Python】成功解决ModuleNotFoundError: No module named ‘bs4’ 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望…

windows10+cpu+pycharm跑yolov5

1、安装anaconda和pycharm,安装方法参考: anaconda和pycharm安装(windows10 )-CSDN博客 2、创建yolov5环境,打开Anaconda Prompt命令打开cmd命令行窗口,如下所示: 输入:conda crea…

.net框架和c#程序设计第一次测试

一、html整体结构 首先&#xff0c;代码的一个整体结构&#xff0c;可以通过输入一个英文!来实现 加个备注&#xff1a; <!DOCTYPE html> <!-- 声明文档类型为 HTML --> <html lang"en"> <!-- 标识文档语言为英语 --> <head><met…

谷歌关键词优化#川圣SEO#蜘蛛池

baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; 谷歌关键词优化&#xff0c;也被称为谷歌搜索引擎优化 (SEO)&#xff0c;是一种策略&#xff0c;旨在提高网…

一个悄然崛起的AI开源项目!

众所周知&#xff0c;最近这半年AI相关的话题实在是火到出圈。尤其是生成式AI的流行&#xff0c;让我们普通人也可以近距离地接触和应用AI。这其中最典型的就是ChatGPT。 那除了ChatGPT&#xff0c;还有一个非常实用的领域&#xff0c;也是我们今天要讨论的话题&#xff0c;那…

C++内存分布与动态内存管理

文章目录 :dizzy: C/C内存分布:dizzy:C语言中动态内存管理方式  :sparkles:malloc   :sparkles:calloc  :sparkles:realloc :dizzy:C语言中动态内存管理方式  :sparkles:new和delete操作内置类型  :sparkles:new和delete操作自定义类型 :dizzy:operator new与operato…

面试经典-16- 环形链表

题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

揭秘Kafka拦截器的神奇操作

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 揭秘Kafka拦截器的神奇操作 前言拦截器的基本概念Kafka 拦截器的定义和基本原理&#xff1a;拦截器是 Kafka 消息传递的不可或缺的组成部分的原因&#xff1a; 生产者拦截器配置和使用生产者拦截器的步…

C# 文件拖入控件中,显示文件路径

1.设置所需拖入的控件&#xff08;以Textbox为列&#xff09;属性为&#xff1a; this.textBox1.AllowDrop true; //设置AllowDrop 属性为 true&#xff0c;使之支持拖拽&#xff0c;否则拖拽显示禁用状态 2.设置该控件的两个事件&#xff0c;分别为&#xff1a; ①DragEnt…

Vcenter esxi web界面访问提示权限被拒绝

一、问题现象 原因 应该是在vCenter中添加主机的时候&#xff0c;将锁定模式设置成了严格。 二、解决过程 2.1 方式一 BMC登录主机&#xff0c;连接显示器和键盘。 输入账号密码&#xff0c;按F2进行设置&#xff0c;将会打开一个界面&#xff0c;第一个选项是设置密码&…

c++指针的定义和使用

1、定义一个指针 int a10; //定义指针的语法&#xff1a;数据类型 * 指针变量名&#xff1a;int * p&#xff1b; //让指针记录变量a的地址&#xff1a;p &a; int a 10;int* p; p &a; cout << "a的地址为&#xff1a;" << &a <<…

疯狂数钞票H5游戏

移动端微信h5 <template><div class"container" id"container"><div class"regBag"></div><div class"moneyBox"><transitionv-for"(item,index) in showImgList":key"index"…

微服务技术栈之rabbitMQ高级(二)

我们该如何确保MQ消息的可靠性&#xff1f; 如果真的发送失败&#xff0c;有没有其它的兜底方案&#xff1f; 这些问题&#xff0c;在这一次的学习中都会找到答案。 生产者的可靠性 首先&#xff0c;我们一起分析一下消息丢失的可能性有哪些。 消息从发送者发送消息&#…

leetcode一天一题-第1天

为了增加自己的代码实战能力&#xff0c;希望通过刷leetcode的题目&#xff0c;不断提高自己&#xff0c;增加对代码的理解&#xff0c;同时开拓自己的思维方面。 题目名称&#xff1a;两数之和 题目编号&#xff1a;1 题目介绍&#xff1a; 给定一个整数数组 nums 和一个整数…

Instant --java学习笔记

Instant 时间线上的某个时刻 / 时间戳过获取lnstant的对象可以拿到此刻的时间&#xff0c;该时间由两部分组成:从1970-01-01 00:00:00 开始走到此刻的总秒数不够1秒的纳秒数 Instant的常见方法&#xff1a; Instant可以用来记录代码的执行时间&#xff0c;或用于记录用户操作某…

利用Nginx正向代理实现局域网电脑访问外网

引言 在网络环境中&#xff0c;有时候我们需要让局域网内的电脑访问外网&#xff0c;但是由于网络策略或其他原因&#xff0c;直接访问外网是不可行的。这时候&#xff0c;可以借助 Nginx 来搭建一个正向代理服务器&#xff0c;实现局域网内电脑通过 Nginx 转发访问外网的需求。…

macbook使用Parallels Desktop虚拟机中使用外接拓展屏幕

macbook使用安装了windows虚拟机后&#xff0c;想让windows使用macbook外接的拓展屏&#xff0c;其实很简单&#xff0c;只需要在parallels desktop中点击全屏开启&#xff1a; 就可以在windows全屏模式下使用拓展屏幕了

Docker 镜像源配置

目录 一、 Docker 镜像源1.1 加速域名1.2 阿里云镜像源&#xff08;推荐&#xff09; 二、Docker 镜像源配置2.1 修改配置文件2.1.1 Docker Desktop 配置2.1.2 命令行配置 2.2 重启 Docker 服务2.2.1 Docker Desktop 重启2.2.2 命令行重启 2.3 检查是否配置成功 参考资料 一、 …

嘿!终于等到了!应用开发云资源套餐如约而至!

MemFire Cloud平台更新啦&#xff01;&#xff01;此次更新我们推出了万众期待的计费套餐&#xff0c;下面给大家带来详细的介绍~ 计费模式为“基础套餐按量付费”&#xff0c;您可选择购买带有一定配额的基础套餐&#xff0c;超出配额部分可以通过开启“超限按量”功能来转为…

清华大学:《AIGC发展研究资料2.0》

清华大学发布了《AIGC发展研究资料2.0》&#xff0c;该报告旨在聚焦AIGC产业发展的现状、趋势&#xff0c;从技术篇、产业篇、评测篇、职业篇、风险篇等多种角度分析产业发展。 报告还强调了该技术的应用潜力将在教育、医疗、工业制造、交通运输、法律服务等领域发挥&#xff0…
最新文章