C++反汇编,指针和内存分配细节,面试题05

文章目录

  • 20. 指针 vs 引用
  • 21. new vs malloc

20. 指针 vs 引用

  • 指针是实体,占用内存空间,逻辑上独立;引用是别名,与变量共享内存空间,逻辑上不独立。
  • 指针定义时可以不初始化;引用定义时必须初始化。
  • 指针的值可以变,即可以指向别的内存地址;引用不变的。
  • 指针可以为nullptr;引用不能为空。
  • sizeof(指针)计算指针大小,由于指针保存的是内存地址,所以无论什么类型的指针,在32位程序里占4B,在64位程序里占8B;而sizeof(引用)计算引用对象的大小。
  • 指针自增用于地址偏移,运算结果取决于指针类型,因为当指针保存的是数组首地址时,为了能够利用指针自增后访问到数组下一成员,所以加的是类型长度,而非1,如下图;引用自增是引用对象自增。
    在这里插入图片描述
  • 指针取出数据内容时需要解引用;引用不需要。
  • 有二级指针;没有二级引用。
  • 【注意】 如果返回动态分配的内存,必须使用指针,使用引用会内存泄漏,如下图。
    在这里插入图片描述
    分析1:使用CRT库检测内存泄漏,4B,因为不能删除引用指向的内存地址,即使用 delete& ref 会触发中断
    在这里插入图片描述
    分析2:相比之下,使用指针返回动态分配的内存,可以在不需要时使用 delete释放内存,从而避免内存泄漏。

21. new vs malloc

  • new是C++运算符;malloc是C的库函数。
  • new返回指定类型指针;malloc返回void*指针,需要强制类型转换。
  • new自动计算需分配的空间;malloc需要指定分配空间的大小。
  • new可以被重载;malloc不能,代码如下。
#include<iostream>
using namespace std;// 重载 new 操作符
void* operator new(size_t size) 
{cout << "Custom new: Allocating " << size << " bytes" << endl;void* ptr = std::malloc(size);if (!ptr) {throw std::bad_alloc(); // 内存分配失败时抛出异常}return ptr;
}// 重载 delete 操作符
void operator delete(void* ptr) noexcept {cout << "Custom delete: Freeing memory" << endl;free(ptr);
}int main() 
{int* arr = new int(4); delete arr;return 0;
}

程序运行结果,如下图。
在这里插入图片描述

  • 代码如下,进行以下分析。
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include<iostream>
using namespace std;class MyClass {
private:int* value;
public:MyClass(int v) : value(new int(v)) {printf("%s\n", "Constructor class");}~MyClass(){delete value;printf("%s\n", "Delete class");}
};int main() 
{MyClass* obj1 = new MyClass(42);MyClass* obj2 = (MyClass*)malloc(sizeof(MyClass));new(obj2) MyClass(44);delete obj1;free(obj2);_CrtDumpMemoryLeaks();return 0;
}
  • new会调用构造函数;malloc不会,即malloc只是分配内存空间,需要在其他地方初始化,如下图。
    在这里插入图片描述
    分析1:MyClass类大小,看它的数据成员大小,即4B。使用new时,先申请4B内存空间,然后调用构造函数进行初始化。
    请添加图片描述
    分析2:使用malloc时,只申请4B内存空间。然后使用new(obj2) MyClass(44);显示调用构造函数,进行初始化。
    在这里插入图片描述
    分析3:new的内部实现,会调用malloc分配内存空间。

  • 【注意】 new使用delete释放内存空间,在释放前会调用析构函数;malloc使用free释放内存空间,由于不会调用析构函数,会造成内存泄漏,如下图。
    请添加图片描述
    在这里插入图片描述

分析1:使用delete时,先调用析构函数释放对象内存空间,再释放指针内存空间。
请添加图片描述
分析2:使用free时,只释放指针内存空间,由于对象内存空间无法释放,造成内存泄漏。

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

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

相关文章

一文玩转Vue3参数传递——全栈开发之路--前端篇(8)

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

【2024全国青少年信息素养大赛初赛时间以及模拟题】

2024全国青少年信息素养大赛时间已经出来了 目录 全国青少年信息素养大赛智能算法挑战赛初中模拟卷 全国青少年信息素养大赛智能算法挑战赛初中模拟卷 1、比赛时间和考试内容&#xff1a; 算法创意实践挑战赛初中组于5月19日举行&#xff0c;检录时间为10:30-11:00&#xf…

微服务---gateway网关

目录 gateway作用 gateway使用 添加依赖 配置yml文件 自定义过滤器 nacos上的gateway的配置文件 我们现在知道了通过nacos注册服务&#xff0c;通过feign实现服务间接口的调用&#xff0c;那对于不同权限的用户访问同一个接口&#xff0c;我们怎么知道他是否具有访问的权…

python:画折线图

import pandas as pd import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties# 设置新宋体字体的路径 font_path D:/reportlab/simsun/simsun.ttf# 加载新宋体字体 prop FontProperties(fnamefont_path)""" # 读取 xlsx 文件 d…

leetcode每日一题第七十二天

class Solution { public:TreeNode* searchBST(TreeNode* root, int val) {if(!root) return root;if(root->val val) return root;else if(root->val > val) return searchBST(root->left,val);else return searchBST(root->right,val);} };

了解tensorflow.js

1、浏览器中进行机器学习的优势 浏览器中进行机器学习&#xff0c;相对比与服务器端来讲&#xff0c;将拥有以下四大优势&#xff1a; 不需要安装软件或驱动&#xff08;打开浏览器即可使用&#xff09;&#xff1b;可以通过浏览器进行更加方便的人机交互&#xff1b;可以通过…

5.06号模拟前端面试8问

5.06号模拟前端面试8问 1.promise如何实现then处理 在JavaScript中&#xff0c;Promise 是一个代表异步操作最终完成或失败的对象。它有三种状态&#xff1a;pending&#xff08;等待&#xff09;&#xff0c;fulfilled&#xff08;完成&#xff09;&#xff0c;rejected&…

【Git】Git学习-15:分支简介和基本操作

学习视频链接&#xff1a;【GeekHour】一小时Git教程_哔哩哔哩_bilibili​编辑https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 git bran…

Superset二次开发之XAxis 功能优化

背景&#xff1a; 以柱状图&#xff08;来自Echarts 插件&#xff09;为例&#xff0c;如果X轴data数据过长&#xff0c;影响图表体验&#xff0c;为此需要省略部分内容 superset-frontend\plugins\plugin-chart-echarts\src\Timeseries\transformProps.ts import {getBaselin…

【C++】string类的使用②(容量接口Capacity || 元素获取Element access)

&#x1f525;个人主页&#xff1a; Forcible Bug Maker &#x1f525;专栏&#xff1a; STL || C 目录 前言&#x1f525;容量接口&#xff08;Capacity&#xff09;size和lengthcapacitymax_sizereserveresizeclearemptyshrink_to_fit &#x1f525;元素获取&#xff08;Ele…

【华为】IPSec VPN手动配置

【华为】IPSec VPN手动配置 拓扑配置ISP - 2AR1NAT - Easy IPIPSec VPN AR3NATIPsec VPN PC检验 配置文档AR1AR2 拓扑 配置 配置步骤 1、配置IP地址&#xff0c;ISP 路由器用 Lo0 模拟互联网 2、漳州和福州两个出口路由器配置默认路由指向ISP路由器 3、进行 IPsec VPN配置&…

Web 安全基础理论

Web 安全基础理论 培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;624032112 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 移动应用开发群&#xff1a;548238632 短视频制作群&#xff1a; 744125867极安云…

nginx代理原理(端口复用)探究

前言&#xff1a;对于一些常用的插件&#xff0c;我们应该学会如何使用。同时&#xff0c;其实现原理也要进行深究&#xff0c;可以为其他的项目开发做借鉴。 探究方案&#xff1a; 一、发布两个不同的服务&#xff0c;这两个服务的端口不致 二、配置nginx&#xff0c;让这两…

2024年美国市场亚太游戏品牌数字广告洞察报告

来源&#xff1a;Sensor Tower 美国是全球最大的游戏市场之一&#xff0c;也是亚太游戏品牌出海的重要市场。2023年Q2至2024年Q1&#xff0c;美国市​场广告投放额排名前10的亚太游戏品牌&#xff0c;合计支出 超过7.5亿美元&#xff0c;环比上涨23%。 排名第一的米哈游(miHoY…

免费思维13招之二:第三方思维

思维02:第三方思维 第三方思维又叫第三方资费思维。是一种可以使你的产品免费但是你却依然赚钱的思维。 大家还记得之前讲的“餐厅免费吃饭却年赚百万”的案例吗?这个案例运用了多种免费思维的子思维,其中也用到了第三方资费思维,怎么运用的呢?韩女士,与各行各业合作,…

【C语言】内存函数的概念,使用及模拟实现

Tiny Spark get dazzling some day. 目录 1. memcpy-- 函数原型-- 函数使用-- 函数的模拟实现 2.memmove-- 函数原型-- 函数使用-- 函数的模拟实现 3. memset-- 函数原型-- 函数使用-- 函数的模拟实现 4. memcmp-- 函数原型-- 函数使用-- 函数的模拟实现 1. memcpy 使用需包含…

BI赋能金融新质生产力,16家金融机构智能BI创新实践分享

2024年政府工作报告强调&#xff0c;要“大力发展科技金融、绿色金融、普惠金融、养老金融、数字金融”&#xff0c;同时“大力推进现代化产业体系建设&#xff0c;加快发展新质生产力”。对于金融行业而言&#xff0c;培育新质生产力是高质量发展的关键着力点。金融机构可以通…

【JavaWeb】Servlet+JSP+EL表达式+JSTL标签库+Filter过滤器+Listener监听器

需要提前准备了哪些技术&#xff0c;接下来的课才能听懂&#xff1f; JavaSE&#xff08;Java语言的标准版&#xff0c;Java提供的最基本的类库&#xff09; Java的开发环境搭建Java的基础语法Java的面向对象数组常用类异常集合多线程IO流反射机制注解Annotation… MySQL&…

FinalShell连接虚拟机Linux系统连接超时

报错信息 java.net.ConnectException: Connection timed out: connect 排除是网络问题后可以尝试一下这个方法。 解决方案: 打开虚拟机终端输入:ifconfig 会出现端口信息: 看ens33这里的端口是多少&#xff0c;改一下重新连接就ok。

保研面试408复习 4——操作系统、计网

文章目录 1、操作系统一、文件系统中文件是如何组织的&#xff1f;二、文件的整体概述三、UNIX外存空闲空间管理 2、计算机网络一、CSMA/CD 协议&#xff08;数据链路层协议&#xff09;二、以太网MAC帧MTU 标记文字记忆&#xff0c;加粗文字注意&#xff0c;普通文字理解。 1、…