当前位置: 首页 > news >正文

[C++内存管理]new,delete,operator new,opreator delete

💖💖💖欢迎来到我的博客,我是anmory💖💖💖
又和大家见面了
欢迎来到C++探索系列
作为一个程序员你不能不掌握的知识
先来自我推荐一波
个人网站欢迎访问以及捐款
推荐阅读
如何低成本搭建个人网站
专栏:动画详解leetcode算法题
C语言知识
玉桂狗yay

new和delete操作内置类型

申请单个空间用new/delete
申请多个空间用new/delete[]

#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>
using namespace std;int main()
{// 动态申请一个int类型的空间int* p1 = new int;// 动态申请一个int类型的空间并初始化为10int* p2 = new int(10);// 动态申请3个int类型的空间int* p3 = new int[3];cout << "address of p1 = " << p1 << endl;cout << "address of p2 = " << p2 << endl;cout << "address of p3 = " << p3 << endl;delete p1;delete p2;delete[] p3;return 0;
}

new和delete操作自定义类型

new/delete会自动调用构造和析构函数
类A是我们自定义的一个类型

class A
{
public:A(int a = 0){_a = a;cout << "A()" << endl;}~A(){cout << "~A()" << endl;}
private:int _a;
};int main()
{A* p1 = new A;delete p1;A* p2 = new A(3);delete p2;A* p3 = new A[3];delete[] p3;return 0;
}

其运行结果如下:
自定义类型new/delete
因为p3申请了三个空间,所以构造和析构函数调用了3次

operator new和operator delete函数

这两个函数允许用户定义自己的new和delete方式
在函数中可以对分配的内存进行开辟成功或失败的判断
如果失败则抛出异常

class A
{
public:A(int a = 0){cout << "A()" << endl;}~A(){cout << "~A()" << endl;}void* operator new(size_t size){cout << "operator new was used" << endl;void* memory = malloc(size);// 当分配内存失败时,抛出异常if (memory == nullptr){bad_alloc;}return memory;}void operator delete(void* ptr){cout << "operator delete was used" << endl;free(ptr);ptr = nullptr;}private:int _a;
};int main()
{A* p1 = new A;// 调用自己的new重载delete p1;// 调用自己的delete重载return 0;
}

malloc/free和new/delete的区别

malloc/free和new/delete的共同点是:都是从堆上申请空间,并且需要用户手动释放。不同的地
方是:

  1. malloc和free是函数,new和delete是操作符
  2. malloc申请的空间不会初始化,new可以初始化
  3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,
    如果是多个对象,[]中指定对象个数即可
  4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需
    要捕获异常
  6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new
    在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成
    空间中资源的清理释放

结语

💖💖💖非常感谢各位的支持💖💖💖
我们共同进步
本系列持续更新,关注我,带你了解更多C++知识
下期再见
玉桂狗yay

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 生成随机字符串(字母+数字)-批发行业进销存- PHP源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
  • Redis7.0.15 主从复制、哨兵模式搭建
  • Topsis法模型(评价类问题)
  • Sql Server索引的创建及优化
  • 多模态:Seed-story故事生成
  • 七、ESP32-S3上使用MicroPython点亮WS2812智能LED灯珠并通过web控制和JS颜色选择器改变灯珠颜色
  • 记一次 .NET某智慧出行系统 CPU爆高分析
  • 童装商城小程序的设计
  • 【数据结构】哈希应用-海量数据处理
  • MySQL进阶-MySQL管理
  • 【极客日常】Go语言学习干货——从零单排Golang系列合集
  • SSH服务高级配置:强制使用客户端指定的用户登录
  • django学习-数据表操作
  • Linux设置临时环境变量
  • 【vulnhub】Hack the 21LTR: Scene 1 靶机
  • Docker下部署自己的LNMP工作环境
  • exports和module.exports
  • gcc介绍及安装
  • Hibernate最全面试题
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • PHP变量
  • ReactNativeweexDeviceOne对比
  • Spring Boot MyBatis配置多种数据库
  • 动态魔术使用DBMS_SQL
  • 分类模型——Logistics Regression
  • 机器学习学习笔记一
  • 近期前端发展计划
  • 聊聊redis的数据结构的应用
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 一些css基础学习笔记
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • nb
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • ###C语言程序设计-----C语言学习(6)#
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (2)nginx 安装、启停
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • .net core Swagger 过滤部分Api
  • .NET Core跨平台微服务学习资源
  • .NET的微型Web框架 Nancy
  • .NET简谈设计模式之(单件模式)
  • .NET开源项目介绍及资源推荐:数据持久层
  • .NET设计模式(11):组合模式(Composite Pattern)