C++内存管理(每日更新)

news/2024/5/5 20:11:21/文章来源:https://blog.csdn.net/weixin_44673253/article/details/126949229

文章目录

  • 0 概述
    • 0.1 四个层面的基本用法
  • 1 Primitives
    • 1.1 new expression
    • 1.2 delete expression
    • 1.3 调用构造函数与析构函数
    • 1.4 array new & array delete
      • 1.4.1 array new

0 概述


  • C++应用程序
  • malloc非常重要
    在这里插入图片描述

  • 可以看出,C++内存管理主要是有四个层面

在这里插入图片描述


0.1 四个层面的基本用法

  • 使用一下这四个层面
  • 层面1和层面2都是很常见的内存管理分配方法
  • 看看层面3,其实和层面1也就是malloc差不多,其实这个::operator new()这个语句底层服务就是malloc()提供的,下方的delete()底层是free()
  • 对于

在这里插入图片描述


  • 关于层面4,以下是几个层面的分配器使用
  • 使用分配器要记得拿了几个,到时候归还的时候就要还多少个
#ifdef _MSC_VER//以下兩函數都是 non-static,定要通過 object 調用。以下分配 3 個 ints.int* p4 = allocator<int>().allocate(3, (int*)0); allocator<int>().deallocate(p4,3);           
#endif
#ifdef __BORLANDC__//以下兩函數都是 non-static,定要通過 object 調用。以下分配 5 個 ints.int* p4 = allocator<int>().allocate(5);  allocator<int>().deallocate(p4,5);
#ifdef __GNUC__//以下兩函數都是 static,可通過全名調用之。以下分配 512 bytes.//void* p4 = alloc::allocate(512); //alloc::deallocate(p4,512);   //以下兩函數都是 non-static,定要通過 object 調用。以下分配 7 個 ints.    void* p4 = allocator<int>().allocate(7); allocator<int>().deallocate((int*)p4,7);     //以下兩函數都是 non-static,定要通過 object 調用。以下分配 9 個 ints.	void* p5 = __gnu_cxx::__pool_alloc<int>().allocate(9); __gnu_cxx::__pool_alloc<int>().deallocate((int*)p5,9);	  
#endif  
  • 在GNUC当中,放的是字节
  • 以上就是对四个层面的Primitives做的一个示范

1 Primitives

1.1 new expression

  • new后面需要加上class name
  • new会做什么动作?会分配一块内存,准备放object,分配好后自动调用构造函数,当然自动被调用不是被new调用
  • new做两个动作,分配内存+调用构造函数

  • new Complex(1, 2)使用C++标准语言实现
  • 注意operator new()那一句就是进行空间的分配,这个底层就是malloc
  • static_cast就是做一个指针的转型
  • 之后需要调用构造函数Complex::Complex(1, 2)这个就是调用构造函数
    在这里插入图片描述

  • 注意看operator new的底层,如果默认的new不行,会调用newh用户自己设定的函数,如果这边malloc失败就会来调用你设定的那个newh函数
  • 在自己设定的newh释放内存之后,以便重新调用malloc
  • 当山穷水尽的时候,内存用完了,就会调用你设定的函数newh以便释放内存然后重新malloc

1.2 delete expression

  • delete会先调用析构函数,执行完毕,对象内存会被释放

在这里插入图片描述


  • 如上的转换
  • 可以看出delete就是free()

1.3 调用构造函数与析构函数


在这里插入图片描述

  • 问题1:为什么是class std::basic_string而不是string?因为string只是一个typedef,所以真正的还是basic_string

#include <iostream>
#include <string>
//#include <memory>				 //std::allocator  namespace jj02
{class A
{
public:int id;A() : id(0)      { cout << "default ctor. this="  << this << " id=" << id << endl;  }A(int i) : id(i) { cout << "ctor. this="  << this << " id=" << id << endl;  }~A()             { cout << "dtor. this="  << this << " id=" << id << endl;  }
};void test_call_ctor_directly()
{cout << "\ntest_call_ctor_directly().......... \n";	string* pstr = new string;cout << "str= " << *pstr << endl;//! pstr->string::string("jjhou");  //[Error] 'class std::basic_string<char>' has no member named 'string'
//! pstr->~string();	//crash -- 其語法語意都是正確的, crash 只因為上一行被 remark 起來嘛.  cout << "str= " << *pstr << endl;//------------A* pA = new A(1);         	//ctor. this=000307A8 id=1cout << pA->id << endl;   	//1
//!	pA->A::A(3);                //in VC6 : ctor. this=000307A8 id=3//in GCC : [Error] cannot call constructor 'jj02::A::A' directly//!	A::A(5);	  				//in VC6 : ctor. this=0013FF60 id=5//         dtor. this=0013FF60  	//in GCC : [Error] cannot call constructor 'jj02::A::A' directly//         [Note] for a function-style cast, remove the redundant '::A'cout << pA->id << endl;   	//in VC6 : 3//in GCC : 1  	delete pA;                	//dtor. this=000307A8 
  • 可以看出这个是在VC6当中是可以调用构造函数的,但是在其他编译器当中不行
//!	pA->A::A(3);                //in VC6 : ctor. this=000307A8 id=3//in GCC : [Error] cannot call constructor 'jj02::A::A' directly//!	A::A(5);	  				//in VC6 : ctor. this=0013FF60 id=5//         dtor. this=0013FF60  	//in GCC : [Error] cannot call constructor 'jj02::A::A' directly//         [Note] for a function-style cast, remove the redundant '::A'cout << pA->id << endl;   	//in VC6 : 3//in GCC : 1  	delete pA;                	//dtor. this=000307A8 
  • 欲想直接调用构造函数,可使用placement new: new (p)Complex (1,2);

1.4 array new & array delete

1.4.1 array new

  • 顾名思义,就是一次性建造一整个array的对象
  • Complex*pca = new Complex[3];

在这里插入图片描述


  • delete[]注意看后面的方框,如果没有后面的方框,就只会调用一次的析构
  • 加上了[]就说明会调用三次的析构

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

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

相关文章

NFT重构票务系统

什么是NFT&#xff1f; NFT是运行在区块链上的一种不可分割的凭证&#xff08;Non-Fungible Token&#xff09;&#xff0c;或者称为非同质化代币。NFT目前主要用在数字艺术品的铸造、拍卖、流转&#xff0c;因为一个NFT能唯一地确定它的所有者&#xff0c;并可在链上跟踪每一…

自然语言语义分析研究进展_笔记

自然语言语义分析研究进展_笔记 词语语义分析&#xff1a;确定词语意义&#xff0c;衡量两个词之间的语义相似度或相关度; 句子语义分析&#xff1a;研究包含句义分析和句义相似度分析两方面; 文本语义分析&#xff1a;识别文本的意义、主题、类别等语义信息的过程&#xff…

使用@JsonFormat并进一步了解:格式化java.util.Date对象

Java 8 Spring Boot 2.7.3 jackson 2.13.3 -- ben发布于博客园 0、前言 开发过程中遇到问题: 前端调用接口得到的时间对象(java.util.Date)总是存在这样那样的问题。 调查后发现,可以使用 @JsonFormat注解(来自jackson依赖包)解决相关问题。 ben发布于博客园 新建spring …

区块链分叉带来的安全挑战

区块链分叉分为软分叉和硬分叉。本文主要探讨的是硬分叉&#xff0c;一种不支持向后兼容的软件升级方式。硬分叉是共识的分裂或者改变&#xff0c;共识就是区块链系统中各节点达成数据一致性的算法&#xff0c;正常情况下每个节点需要运行相同规则的算法&#xff0c;例如比特币…

计算机毕业设计之java+javaweb的影院管理系统-电影院管理系统

计算机毕业设计之javajavaweb的影院管理系统-电影院管理系统 项目介绍 影院的需求和管理上的不断提升,影院管理的潜力将无限扩大,影院管理系统在业界被广泛关注,本网站及对此进行总体分析,将影院信息管理的发展提供参考。影院管理系统对影院发展有着明显的带动效应,尤其对当地影…

【ManageEngine】OpManager 2022用户体验报告

关于SoftwareViews SoftwareReviews是Info-Tech Research Group的一个部门&#xff0c;是一家世界级的技术研究和咨询公司&#xff0c;拥有超过20年的基于研究的IT建议和技术实施。 SoftwareViews务实的工具和详细的客户洞察力帮助软件购买者在技术决策中取得最大成功。 Sof…

Java并发编程解析 | 基于JDK源码解析Java领域中ReentrantLock锁的设计思想与实现原理 (一)

苍穹之边,浩瀚之挚,眰恦之美; 悟心悟性,善始善终,惟善惟道! —— 朝槿《朝槿兮年说》写在开头在并发编程领域,有两大核心问题:一个是互斥,即同一时刻只允许一个线程访问共享资源;另一个是同步,即线程之间如何通信、协作。主要原因是,对于多线程实现实现并发,一直以…

全能赛道、热门方向、稀缺数据,“嬴彻-清华AIR杯”自动驾驶技术大赛火热开赛中

如果你关注自动驾驶,那有这样一个算法大赛,值得参与。由卡车自动驾驶领导者嬴彻科技与清华大学智能产业研究院(AIR)精心打造的“嬴彻-清华AIR杯”自动驾驶技术挑战赛正火热开赛中。这是国内首个同时覆盖干线物流和城市道路双赛道的大赛。决策规划是自动驾驶当下的热门方向和技术…

go语言的基本数据类型

基本数据类型中的常量已经介绍了 var const iota 。此处要对字符串特别说明&#xff0c;字符串也会被认为是基本数据类型&#xff0c;字符串实际在底层原理上与复合类型的数据非常相似。同事go语言支持八进制&#xff0c;6进制&#xff0c;科学计数法。空指针的值是nil。 整…

百度地图API

一、百度地图API接入 1、搜索百度地图开发平台 2、注册百度账号 3、登陆并申请成为开发者 4、在百度地图开发平台的首页选择控制台&#xff0c;在控制台中创建应用 创建好应用以后就能在控制台我的应用中看到这个应用&#xff0c;其中最重要的是AK&#xff0c;这是百度地图…

从0-1,如何用低代码搭建管理系统

关键字&#xff1a;功能模块、流程中心、OA 前言&#xff1a;对于搭建系统&#xff0c;字眼上都知道是怎么回事&#xff0c;但要怎么搭建到最后怎么呈现一个投入运作的系统&#xff0c;估计就很少人知道了。当然作为专业的程序员肯定知道怎么操作&#xff0c;但是不是必须要专业…

IDEA集成Git

介绍 参考视频教程: https://www.bilibili.com/video/BV1vy4y1s7k6?p27 1 配置 Git 忽略文件 1.1为什么要配置 问题 1:为什么要忽略他们&#xff1f; 答&#xff1a;与项目的实际功能无关&#xff0c;不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之 间的差异。…

湖仓一体电商项目(十八):业务实现之编写写入DWD层业务代码

文章目录 业务实现之编写写入DWD层业务代码 一、代码编写 二、​​​​​​​​​​​​​​创建Iceberg-DWD层表 1、在Hive中添加Iceberg表格式需要的包 2、创建Iceberg表 三、代码测试 1、在Kafka中创建对应的topic 2、将代码中消费Kafka数据改成从头开始消费 3、执…

【展馆攻略】展馆室内精准定位导航服务,便捷无忧,所见必达!

近年来&#xff0c;室内定位导航服务被各大商场、园区、景区等场所广泛使用&#xff0c;逐渐融入到人们日常生活中。室内地图从传统的平面信息图发展到智能化3D可视化交互展示&#xff0c;实现了室内综合场景的精准定位导航。 在面对室内或者建筑物遮挡区域&#xff0c;室内导航…

浏览器如何渲染页面?

DOM 浏览器渲染页面的过程就像是盖房子&#xff0c;一般先请求服务器得到HTML文件&#xff0c;HTML文件就相当于网页的框架结构&#xff0c;不过一开始浏览器得到的是显示字节内容的HTML文件&#xff0c;必须要内化为自己看的懂的语言才行&#xff0c;于是就把字节转化为字符&…

vue小案列(hello world)

目录 1 页签图标的报错解决 2 创建vue实例 3 初识Vue分析 1 页签图标的报错解决 1 首先&#xff0c;在我们的html中定义一个容器&#xff0c;然后右键&#xff08;Open with LIve Server&#xff09;打开&#xff0c;需要安装LIve Server插件 打开之后发现控制台报如下错误&a…

2022年服装进销存软件排行榜重磅出炉!

小编调研了一下身边做服装行业的老板&#xff0c;普遍反映如今服装实体店越来越难做了&#xff0c;日常经营过程中&#xff0c;难免会遇到各种问题&#xff1a;商品种类多、款式多、库存多、活动多……这些都让老板们应接不暇&#xff0c;尽管每天早出晚归地管理店铺&#xff0…

怎么音频转文字?快把这些方法收好

相信不少的小伙伴&#xff0c;经常需要对自己的录音文件进行整理归纳吧&#xff0c;其中不乏是课堂的重点知识、会议上的重点纪要、谈判中的重点内容。那小伙伴们平时在整理的时候&#xff0c;大概都需要花费多少时间呢&#xff1f;为了能够将音频的内容完整呈现出来&#xff0…

SpringBoot多数据源

使用场景 在实际开发中&#xff0c;可能遇到多数据源的场景。 业务复杂&#xff08;数据量大&#xff09; 数据分布在不同的数据库中&#xff0c;对业务数据进行垂直拆分。 可以拆分为微服务架构&#xff0c;依赖的业务可以通过远程调用的方式来是实现&#xff0c;那么这种方…

机器学习中常见性能度量汇总

前言 如果你对这篇文章可感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 回归 在回归任务上&#xff0c;目前最常用的性能度量方式是均方误差 (Mean Squared Error, MSE)&#xff1a; MSE1m∑i1…