C++学习笔记 —— 内存分配 new

news/2024/11/10 14:27:59 标签: c++, 学习, 笔记
//创建数值
int *pi = new int; //pi指向动态分配的,未初始化的无名对象
delete pi;
int *pi = new int(10); //pi指向动态分配的,初始化10
delete pi;

//创建数组
int *a = new int[5];  //创建一个数组,未初始化数值
delete []a;  // new 和 delete 必须对应使用,new 创建一组对象,那么 delete 就要释放一组对象
int *a = new int[5]{1,2,3,4,5};//创建数组,初始化数值
int *a = new int[get_size()]; //可以使用变量创建数组

//创建类
class A { ... };  // 声明一个类 A
A *obj = new A();  // 使用 new 创建对象
delete obj;

【分析】
这里我们需要注意,new int[5] 仅仅分配了空间,但是 new A(),不仅仅为对象 obj 在堆上分配了空间,而且还调用了 A的构造函数,生成了这个对象

所以 new A() 这样方式的功能如下:

  1. 在堆上分配空间
  2. 在分配空间上调用对象的构造函数(这也是 new 和 malloc 的主要区别,是否调用构造函数)

同理,在调用 delete obj 的时候

  1. 首先调用 这个对象 的析构函数
  2. 然后释放这个对象的空间

用系统默认的 malloc() 分配的内存要交给系统默认的 free() 去释放;
用系统默认的 new 表达式创建的对象要交给系统默认的 delete 表达式去析构并释放;
用系统默认的 new[] 表达式创建的对象要交给系统默认的 delete[] 表达式去析构并释放;

new 和malloc区别

  1. new/delete 是C++中的运算符。malloc/free 是函数
  2. malloc 申请内存空间时,手动计算所需大小,new 只需要类型名,自动计算大小
  3. malloc 申请的内存空间不会初始化,new 可以初始化(需要调用构造函数)
  4. malloc 的返回值为 void*,接受时必须强转,new不需要
  5. malloc 申请内存空间失败时,返回的是NULL,使用时必须判空;new申请内存空间失败时会抛出异常(可以加上 nothrow),所以要有捕获异常处理程序
struct Mystruct {
	int a;
	int b;
};
int main()
{
	int * ptr = (int *) malloc( sizeof(int)*10 );//分配一个10个int元素的数组
	int * ptr = new int[10];//分配一个10个int元素的数组

	Mystruct *my = (struct Mystruct*) malloc(sizeof(struct Mystruct)); //不会初始化成员
	Mystruct *my = new Mystruct(); //会自动初始化成员为0

}

http://www.niftyadmin.cn/n/5666807.html

相关文章

大数据时代:历史、发展与未来

文章目录 引言1980年:大数据的先声2006年:云计算与大数据的诞生2008年:大数据的科学探索2009年:大数据成为行业热词2011年:大数据的商业价值2013年:世界大数据元年结语 引言 在信息技术飞速发展的今天&…

linux-软件包管理-包管理工具(Debian 系)

Linux 软件包管理概述 在Linux系统中,软件包管理是系统维护的核心部分之一。通过软件包管理器,用户可以方便地安装、更新、删除和查询系统中的软件包。每个Linux发行版通常都有自己专属的包管理工具,这些工具基于不同的包格式。例如&#xf…

Springboot的三层架构

package com.wzb.ThreeLevelsExercise20240919;public class Exercise {// 内聚:内聚是指一个模块或内部各元素的紧密程度。高内聚则是一个模块或类中的所有功能都是紧密相关的,专注于完成单一任务// 高内聚的好处:// 1.易于维护:…

优化算法(四)—蚁群算法(附MATLAB程序)

蚁群算法(Ant Colony Optimization, ACO)是一种模拟蚂蚁觅食行为的优化算法,由Marco Dorigo于1990年提出。它利用了蚂蚁在寻找食物的过程中通过释放信息素来相互影响的机制,以找到最优解或接近最优解。蚁群算法特别适用于解决组合…

C++ : 继承问题 [virtual函数调用,为什么禁止在virtual使用默认参数]

文章目录 子类指针,父类指针分别调用virtual函数,与非virtual函数虚函数中尽量不要使用默认参数!!! 子类指针,父类指针分别调用virtual函数,与非virtual函数 virtual函数,通过指针调…

有毒有害气体检测仪的应用和性能_鼎跃安全

随着现代工业的不断发展和扩张,越来越多的企业涉及到有毒有害气体的生产、使用和处理。工业规模的扩大导致有毒有害气体的排放量增加,同时也增加了气体泄漏的风险。在发生火灾、爆炸或危险化学品泄漏等紧急事件时,救援人员需要迅速了解现场的…

【tomcat】tomcat学习笔记

文章目录 1.tomcat乱码问题1.1 linux乱码中文显示乱码问号问题1.2windows乱码1.2.1 方式一1.2.2方式二 1.3 Idea中运行tomcat乱码问题 2. 获取tomcat启动端口号3. idea运行tomcat 的配置问题4.dockerfile构建tomcat镜像问题4.1 替换端口号 5.启动多个tomcat方法6.修改tomcat JA…

汽车焊机数据通信:Profinet转Canopen网关的神奇连接

在汽车制造领域,汽车焊机的高效、稳定运行对于整车质量至关重要。而Profinet转Canopen网关在汽车焊机的数据通信中发挥着关键作用。 Profinet是一种广泛应用于工业自动化领域的通信协议,具有高速、实时、可靠等特点。Canopen则在汽车电子等领域有着广泛…