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.mzph.cn/diannao/11288.shtml

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

相关文章

mmdetection在训练自己数据集时候 报错‘ValueError: need at least one array to concatenate’

问题&#xff1a; mmdetection在训练自己数据集时候 报错‘ValueError: need at least one array to concatenate’ 解决方法&#xff1a; 需要修改数据集加载的代码文件&#xff0c;数据集文件在路径configs/base/datasets/coco_detection.py里面&#xff0c;需要增加meta…

【GD32F470紫藤派使用手册】第五讲 PMU-低功耗实验

5.1 实验内容 通过本实验主要学习以下内容&#xff1a; PMU原理&#xff1b; 低功耗的进入以及退出操作&#xff1b; 5.2 实验原理 5.2.1 PMU结构原理 PMU即电源管理单元&#xff0c;其内部结构下图所示&#xff0c;由该图可知&#xff0c;GD32F4xx系列MCU具有三个电源域…

驱动丹佛斯比例电磁铁放大器

驱动丹佛斯比例电磁铁是一种用于实现对液压系统连续且精确控制的通电带磁性装置。比例阀由直流比例电磁铁和液压阀两部分组成。其中&#xff0c;比例电磁铁是其核心部件&#xff0c;负责将输入的电信号转换成力和位移输出&#xff0c;从而控制液压阀的工作状态。比例电磁铁通过…

c语言实现十进制(整数,小数)转N进制

文章目录 先来说一下整数转N进制小数转N进制栈和队列代码地址← 今天实现了c语言整数和小数转换为对应的N进制 先来说一下整数转N进制 我们只需要不断的取模然后判断num/N是否等于0就可以了,同时我们还要保存每一组的余数 这里我们的余数是从下往上输出的,是不是就相当于后算出…

海外盲盒小程序:探索世界,发现无限可能

在数字时代&#xff0c;我们渴望突破地域的界限&#xff0c;体验不同文化&#xff0c;感受世界的多彩。为了满足这一需求&#xff0c;我们隆重推出“海外盲盒小程序”——一个让你足不出户&#xff0c;就能探索世界、发现无限可能的神奇平台。 一、独特的盲盒体验 打开“海外盲…

[力扣题解]45. 跳跃游戏 II

题目&#xff1a;45. 跳跃游戏 II 思路 贪心法&#xff1b; 只需记录2个变量&#xff0c;当前点能达到的最远距离&#xff0c;和上一步能到达的最远距离&#xff1b; &#xff08;真有意思&#xff0c;代码随想录给出的是curDistance&#xff0c;nextDistance2个&#xff0c;…

NetApp数据恢复—WAFL文件系统下raid数据恢复案例

NetApp存储数据恢复环境&故障&#xff1a; 某公司NetApp存储设备&#xff0c;人为误操作导致NetApp存储内部分重要数据被删除&#xff0c;该NetApp存储采用WAFL文件系统&#xff0c;底层是由多块硬盘组成的raid阵列。 NetApp存储数据恢复过程&#xff1a; 1、将NetApp存储设…

VBA在Excel中注册登录界面的应用

VBA在Excel中注册登录界面的应用(V潘谆白说VBA) 文章目录 前言一、如何注册登录?二、注册登录界面截图三、操作思路四、运行代码1.注册2.登录3.注册登录界面赋值4.隐藏工作表方法5.显示工作表方法6.打开、关闭工作薄前操作前言 Excel工作表也可以像其他小程序一样,输入账号…

【3D基础】坐标转换——地理坐标投影到平面

汤国安版GIS原理第二章重点 1.常见投影方式 https://download.csdn.net/blog/column/9283203/83387473 Web Mercator投影&#xff08;Web Mercator Projection&#xff09;&#xff1a; 优点&#xff1a; 在 Web 地图中广泛使用&#xff0c;易于显示并与在线地图服务集成。在…

【Linux学习笔记】一篇文章彻底搞定 “Linux同步与互斥“ !

本章重点 1. 学会线程同步。 2 学会使用互斥量&#xff0c;条件变量&#xff0c;posix信号量&#xff0c;以及读写锁。 1、进程线程间的互斥相关背景概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的…

JavaSE继承

1、继承 关键字&#xff1a;extends 继承的作用&#xff1a;多态前提条件&#xff0c;提高代码复用率 继承的缺点&#xff1a; 父类中私有的属性和方法&#xff0c;子类是无法使用的 在java中只支持单继承&#xff0c;不支持多继承&#xff0c;但是可以支持多重继承 继承后…

Sylar C++高性能服务器学习记录12 【IO调度模块-代码分析篇】

早在19年5月就在某站上看到sylar的视频了&#xff0c;一直认为这是一个非常不错的视频。 由于本人一直是自学编程&#xff0c;基础不扎实&#xff0c;也没有任何人的督促&#xff0c;没能坚持下去。 每每想起倍感惋惜&#xff0c;遂提笔再续前缘。 为了能更好的看懂sylar&…

【多电压流程 Multivoltage Flow】- 5.特定工具使用建议(5.使用ICC II以及FC进行物理实现)

使用IC Compiler II和Fusion Compiler进行物理实现 在完成带有行站点、电源规划和I/O放置的floorplan之后,可以继续进行物理综合和实现。Fusion Compiler提供了广泛的功能,以执行设计的平面物理实现。 图67显示了物理实现流程的一般步骤以及流程的低功耗支持特性。 图67 I…

Elasticsearch框架学习的难点和重点有哪些

Elasticsearch是一个基于Lucene构建的开源搜索引擎&#xff0c;广泛用于全文检索、日志数据分析等多种应用场景。由于其强大的搜索能力、灵活的扩展性和丰富的功能特性&#xff0c;Elasticsearch在数据分析和搜索领域非常受欢迎。V哥认为学习Elasticsearch主要包括以下几个难点…

极度内卷,消费下行,AIGC如何成为普通人易变现好上手的新机会,这几种方法一定要尝试!

最近看到一个麦肯锡报告&#xff0c;说到2030年&#xff0c;AI会替代1亿多中国人的岗位。 暂且不说这个预测是否准确&#xff0c;但自从AI横空出世&#xff0c;确实给我们的生活带来了翻天覆地的变化&#xff0c;有人顺势起飞&#xff0c;有人被时代淘汰… 李开复也曾不止一次…

47-Qt控件详解:Buttons Containers1

一 QPushButton (命令按钮) #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QPushButton>//引入QPushButton类对应的头文件class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWind…

如何评估大型语言模型(LLM)?

01 简介 Introduction 随着ChatGPT和其他大型语言模型&#xff08;LLMs&#xff09;的发布&#xff0c;可用模型数量大量增加&#xff0c;现在几乎每天都有新的LLMs发布。尽管如此&#xff0c;当下仍然没有一个通用的标准来评估这些大型语言模型的质量。本文将回顾现有的大型语…

振弦式表面式应变计有哪些功能优势

振弦式表面应变计是一种高精度的测量工具&#xff0c;专门用于测量材料表面的应变和位移。它通过监测材料表面的微小变化&#xff0c;帮助工程师获得关键的结构性能数据。振弦式表面应变计因其独特的功能优势&#xff0c;在众多领域尤其是在结构健康监测中&#xff0c;发挥着不…

卡尔曼滤波状态估计

clear all; close all; clc; %% 上面是调用卡尔曼滤波 % 定义状态维数和初始条件 n 3; % 状态维数 q 0.2; % 过程噪声标准差 r 0.15; % 测量噪声标准差 Q q * eye(n); …

vite配置别名@时遇到错误【Dynamic require of “path“ is not supported 】

遇到的问题 vite项目中配置别名的时候&#xff0c;使用 const path require("path") 的形式引入path的时候提示错误&#xff1a; failed to load config from C:\Users\Administrator\Desktop\zss\note\demo\demo\vite.config.js 10:30:31 [vite] Dynamic require…