当malloc为string等容器开内存时候产生的问题,malloc和new最本质的区别

news2024/9/22 6:40:40

报内存错误的代码:

在这里插入图片描述

顺利执行的代码:

在这里插入图片描述

可以看到在malloc为a开好空间,然后对自定义类型对象a中的string a成员进行赋值的时候,发生了内存错误,但是经过测试,使用new为string a开空间就不会发生错误;

new和malloc最本质的区别

最主要的本质区别:new会调用开空间对象的构造函数,malloc不会简单无脑直接开空间;

关于new操作符底层封装malloc,加了抛异常机制,还有他们用法上的区别这些就不谈了;

这样,上面malloc string的问题就可以解释了;


原因

首先C++内置string字符串自定义类型,一般new为string开空间的时候,string底层会在 构造函数调用过程中 在堆上再开一个char*的空间(malloc或者new为string开了空间,而string的构造函数还得为内部成员char*再开一个空间的),这个二次开的空间相当于是个变长数组,用于存放一个个的字符;(vector,queue等存储容器都是这样的机制)

那么我们malloc简单无脑的为string开了空间以后,不调用string人家的构造函数导致string内部这个堆上存放字符的空间没开出来,接着我们往string a中放字符的肯定就会放不进去啦,直接内存错误,因为你都没地方怎么放

new的话,调用了string的构造函数,内部的空间开出来了,当然就没问题了,能放字符进去了


分析

其实这怪不得malloc太简餐粗暴,也怪不得string太复杂;

malloc本来就是和C一起诞生的,C中本来就没C++封装的这种概念,完全不会出现上面malloc string这种需要在底层自己再开一块空间的现象,人家用malloc舒服着呢;

C++有了封装,支持了面向对象,当然好处多多,也为此配套了new这种不会产生问题的开空间方式,只是语言特性,C++为了支持C,malloc也流进来了,导致这种混搭错误的出现;

所以以后写程序的时候多多注意就行,new和malloc开空间的时候思考几秒用哪个,当然我个人感觉能用new就别malloc了,new毕竟适配性更高了不是吗;

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

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

相关文章

uniCloud云开发----6、uniapp配置tabbar底部导航栏和去掉uni-app顶部标题

uniapp配置tabbar底部导航栏、去掉uni-app顶部标题前言效果图1、创建页面并声明注册2、配置pages.json--tabBar3、通过pages.json来去掉uni-app顶部标题全部页面都去掉单个页面去掉前言 tabbar文档 在 pages.json 中提供 tabBar 配置,不仅仅是为了方便快速开发导航…

Elasticsearch入门,持续更新中

目录elasticsearch简介elasticsearch下载问题分析解决启动可视化界面Kibana下载配置启动进入kibana的控制台elasticsearch简介 懂得都懂 elasticsearch下载 官网下载地址 链接: https://www.elastic.co/cn/downloads/elasticsearch 本人准备安装在win10上,本地…

IB学习阶段所需的教材有哪些?

IB课程即国际文凭组织IBO(International Baccalaureate Organization),是为全球学生开设从幼儿园到大学预科的课程,为3-19岁的学生提供智力,情感,个人发展,社会技能等方面的教育,使其…

可以同时解析多个binlog吗

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。作者: 叶金荣文章来源:GreatSQL社区原创 1.可以同时解析多个binlog吗 2.innodb_buffer_pool_instances设…

【C语言进阶】指针的进阶(1)

作者:匿名者Unit 目录一.数组指针1.定义2.使用二.数组、指针传参1.一维数组传参2.二维数组传参3.一级指针传参4.二级指针传参三.函数指针一.数组指针 1.定义 数组指针,顾名思义是指向数组的指针,那数组指针是如何定义的呢 int (*p)[10]; //解释&#x…

JavaSE从基础到入门:异常的学习

1. 异常的概念与体系结构 1.异常的概念 异常(Exception)指不期而至的各种状况,异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据。要打开的文件不存在。网络通信时连接中断,或者JVM内存溢出…

HDMI1.4/2.0 Subsystem官方例程的建立

HDMI1.4/2.0 Subsystem官方例程的建立1、 项目背景明德扬(MDY)为某研究所研制的视频接口转换模块,该模块将HDMI视频转成LVDS7:1视频。视频输入接口采用的是HDMI 4K输入,基于Xilinx K7325t的高速收发器,特点是无需外围HDMI接收芯片,大大简化了…

SpringBoot+VUE前后端分离项目学习笔记 - 【13 SpringBoot和Vue实现导入和导出】

hutool工具 引入Hutool工具使用ExcelWriter&#xff0c;可以将数据写出到EXCEL https://www.hutool.cn/docs/#/poi/Excel%E5%B7%A5%E5%85%B7-ExcelUtil 引入pom依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactI…

项目中不容忽视的图表报表

在项目工作中&#xff0c;报表可是少不了的好帮手&#xff0c;可以帮助我们向合作者以及领导直观地展示项目情况进展。项目报表的作用可以从多维度监控项目的运行&#xff0c;保障项目的顺利进行。让数据可视化&#xff0c;辅助管理者进行合理决策。及时与合作者共享项目信息&a…

使用ros从realsence相机中获取图像

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、使用ros从realsence相机中获取录制的视频并播放1.开启ros内核2.打开realsense相机3.查看当前话题4.在相机界面显示RGB图像和depth图像4.1 添加Image4.2 填入…

智能高效的Go IDE——GoLand v2022.3全新发布

GoLand使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…

javac和java命令详解

javac 是java语言编程编译器。全称java compiler。相信大家在学习java编程的时候&#xff0c;一定使用过javac和java这两个命令。大家在安装JDK的时候&#xff0c;验证是否安装成功&#xff0c;都会在命令行里输入java和javac命令来验证&#xff0c;这就是我们第一次使用java和…

PDF怎么编辑注释? 5 个免费好用的 PDF 注释器

成群结队的人和组织想要注释他们的 PDF 文档的原因有很多。无论哪种情况&#xff0c;目标是做到近乎完美并不是完美。但是&#xff0c;如果您没有合适的 PDF 注释器&#xff0c;这又是不可能的。虽然这些 PDF 注释器工具中的许多都很昂贵&#xff0c;但您仍然可以使用免费的 PD…

tkintertools 模块实战一:任务清单小工具

之前我自己写了一个 tkinter 模块的辅助模块 —— tkintertools&#xff0c;这次试着用这个模块开发了一款可以记录任务的小工具&#xff0c;应该会比较实用。tkinter 模块的最强辅助模块 —— tkintertools&#xff08;万字详解&#xff09;_小康2022的博客-CSDN博客tkinter 模…

数字图像处理实验(直方图均衡化规定化)

图像均衡化 图像均衡化是一种图像处理技术&#xff0c;它的目的是改善图像的对比度。 具体来说&#xff0c;对于一张图像&#xff0c;其直方图就是统计图像中各灰度级出现的次数的图像。通常情况下&#xff0c;图像的直方图会呈现不平衡的状态&#xff0c;即图像的某些灰度级出…

SQLSERVER 的主键索引真的是物理有序吗?

一&#xff1a;背景 1. 讲故事 最近在看 SQL SERVER 2008 查询性能优化&#xff0c;书中说当一个表创建了聚集索引&#xff0c;那么表中的行会按照主键索引的顺序物理排列&#xff0c;这里有一个关键词叫&#xff1a;物理排列&#xff0c;如果不了解底层原理&#xff0c;真的…

5G NR标准: 第18章 射频特性

第18章 射频特性 如第 3 章所述&#xff0c;NR 的射频特性与 5G 的可用频谱以及在这些频谱分配中运行所需的频谱灵活性密切相关。 虽然频谱灵活性一直是前几代移动系统的基石&#xff0c;但对于 NR&#xff0c;这一点变得更加突出。 它由几个组成部分组成&#xff0c;包括在不…

C++11 线程异步

文章目录1. 线程异步的概念2. future2.1 共享状态2.2 常用成员函数3. promise3.1 常用成员函数3.2 promise的基本使用4. package_task4.1 常用成员函数4.2 package_task的基本使用5. async5.1 async的基本使用6. promise、package_task、async的对比与总结1. 线程异步的概念 问…

干货 | 读懂 Appium 日志,让测试效率翻倍!

Appium 服务器运行时会产生很多日志&#xff0c;但是很多人并不了解其中的意义&#xff0c;也无法掌握有用的信息。本文将详细解读如何读懂 Appium 日志&#xff0c;并让你的测试效率翻倍。开启服务日志第一行显示了 Appium 版本和运行地址。$ appium[Appium] Welcome to Appiu…

曾经对程序员最好的公司,倒下了

硅谷有一家公司&#xff0c;它发明了同时代最好的CPU&#xff0c;最好的操作系统&#xff0c;最好的编程语言&#xff0c;但是由于傲慢和目光短浅&#xff0c;在短短二十多年间就走到了尽头。它就是Sun Microsystems&#xff0c;硅谷最让人惋惜的公司。1Sun的出现是个巧合。80年…