c++new和delete的匹配问题与raii的定制删除器

news2025/7/20 9:45:59

目录

1.关于new与delete

2.智能指针的定制删除器


1.关于new与delete

这里我想介绍的是new[]与delete[]没有配套使用带来的影响。这个是否发生错误和使用的ide有很大的关系。(这里我用vs平台做示例)

如果对内置类型采用new[]来开辟开辟空间,再用delete来释放空间是没有影响的。

 这里是可以通过编译的。

不过若是对自定义类型采用这种方式释放就会报错。

 这里我们就要深入的了解一下new[]和delete[]的工作方式(针对自定义类型)。new[]的时候会先调用operator new[]开出空间,再用开出的空间进行调用指定次数的构造函数。delete[]的时候会先调用operator delete[]来进行指定次数的析构,再将空间释放。

核心问题:new[n]完了,delete[]如何拿到这个n值呢?

vs下的处理方式:

 如图,以开三个Node空间来举例,编译器会默认多开4个字节来计数,new[]结束,指针会偏移至计数空间的结尾。这时,我们如果采用delete方式来释放空间,析构或许可以正常执行一次,Node1或许会被析构。不过此时找不到空间的起始位置,delete整个空间时对应不上正确位置就会报错。


2.智能指针的定制删除器

为了解决上述问题,智能指针给了定制删除器的方案。

unique_ptr:

他的定制删除器只接收传类型。

#include<iostream>

using namespace std;

class Node
{
public:
	~Node()
	{
		cout << "~Node" << endl;
	}
private:
	int _val=0;
};

template<class T>
struct DelteAryy //搞一个专门delete[]的
{
	void operator()(T* t)
	{
		delete[] t;
	}
};
int main()
{
	unique_ptr<Node,DelteAryy<Node>> sp1(new Node[5]);

	return 0;
}

 

如图,成功析构5次。

shared_ptr:

这里我们可以传对象给定制删除器。因此用c++的lambda就会非常省事。

lambda可以参考:c++11有关新特性 

 

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

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

相关文章

postgresql源码学习(50)—— 小白学习Dtrace追踪源码函数调用

不知不觉第50篇了&#xff0c;昨天在文章里&#xff08;https://mp.weixin.qq.com/s/AzBGzYhGxYjSf7Sptj55lQ&#xff09;学到一个追踪源码执行情况的利器 —— Dtrace&#xff0c;本篇记录下实验和笔记。 一、 解决痛点 学习以来一直有一个疑惑&#xff0c;如何将pg中执行的SQ…

Spring Boot 3.0 正式发布,这份升级指南必须收藏

Spring Boot 3.0 现已正式发布&#xff0c;它包含了 12 个月以来 151 个开发者的 5700 多次代码提交。这是自 4.5 年前发布 2.0 以来&#xff0c;Spring Boot 的第一次重大修订。它也是第一个支持 Spring Framework 6.0 和 GraalVM 的 Spring Boot GA 版本&#xff0c;同时也是…

Nginx环境搭建及前端部署教程(Windows版)

1、Nginx简介 Nginx (engine x) 是一个轻量级、高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启动&#xff0c;还能在不间断服务的情况下对软件版本进行热更新。性…

2022年,数字化转型升级,越来越重要

所谓数字化营销&#xff0c;指的是使用数字传播渠道推广产品和服务&#xff0c;从而以一种及时、相关、定制化和节省成本的方式与消费者进行沟通。 进入2022年&#xff0c;数字化转型升级&#xff0c;变得越来越重要。 01政策推动数字化发展 国家“十四五”期间将加快推进企业…

arthas进阶版排查问题之idea插件工具操作

arthas前面的文章讲了怎么去使用命令排查线上问题&#xff0c;线上出了问题就需要我们去排查问题和处理程序异常&#xff0c;但是线上一般出问题不太好解决&#xff0c;总有一些奇怪的问题&#xff0c;当然很多场景是测试测试不到的&#xff0c;我们不能百分百保证线上不出问题…

Unreal地形高级材质之根据斜率分配材质

目的&#xff1a;根据地形的斜率来混合地形材质&#xff0c;制作地形时&#xff0c;当地形有高度抬升时&#xff0c;被拉伸部位的贴图会出现拉伸&#xff0c;或者想要在拉伸区域使用其他类型种类的贴图时。如果使用笔刷对地形进行更改是耗费时间的&#xff0c;所以想要整体一次…

数据结构中的树和二叉树(0基础讲解+代码)

树和二叉树树的定义树的一些基本概念树的代码链接方式二叉树完全二叉树和满二叉树二叉树的性质链式二叉树前序遍历后序遍历中序遍历层序遍历二叉树的深度二叉树第k层的结点个数二叉树的叶子节点个数总结前言&#xff1a;前面我们所学习的数据结构比如链表&#xff0c;顺序表&am…

【博客542】k8s使用EndpointSlices扩展大规模service后端服务数量

k8s使用EndpointSlices扩展大规模service后端服务数量 EndpointSlices 端点切片&#xff08;EndpointSlices&#xff09; 提供了一种简单的方法来跟踪 Kubernetes 集群中的网络端点&#xff08;network endpoints&#xff09;。 它们为 Endpoints 提供了一种可扩缩和可拓展的替…

长时间序列模型DLinear(代码解析)

前言 今年时间序列SOTA&#xff0c;DLinear模型&#xff0c;论文下载链接&#xff0c;也可以看我写的论文解析当然最好是读原文。Dlinear&#xff0c;NLinear模型Github项目地址&#xff0c;下载项目文件这里提供我写过注释的项目文件&#xff0c;下载地址 参数设定模块(run_…

图神经网络之预训练大模型结合:ERNIESage在链接预测任务应用

1.ERNIESage运行实例介绍(1.8x版本) 本项目原链接&#xff1a;https://aistudio.baidu.com/aistudio/projectdetail/5097085?contributionType1 本项目主要是为了直接提供一个可以运行ERNIESage模型的环境&#xff0c; https://github.com/PaddlePaddle/PGL/blob/develop/e…

笔记redis

redis特点: 1.这些数据类型都支持 push/pop. add/remove 及取交集并集和差集及更丰富的操作 2.Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件中进行持久化 3.单线路IO多路复用 4.redis操作是原子性操作 redis 单线程模型&#xff1a; Redis 内…

chrome插件开发(manifest_version版本V3 + Ant Design Vue)

1.什么是 Chrome 插件 谷歌浏览器插件是一种小型的定制浏览器体验的程序&#xff0c;通过插件可以自定义浏览器的一些行为来适合个人的需求&#xff0c;例如上面的查看服务器状态插件。 在应用商店中下载下来的插件基本上都是以.crx 为文件后缀&#xff0c;该文件其实就是一个…

Word2Vec

Word2Vec 在自然语言发展的早期阶段&#xff0c;词的表示经历了不断地发展和改进&#xff0c;直到后来有一种word vector的思想被提出以及后续的实现&#xff0c;才极大地促进了NLP的发展。 word vector的核心思想&#xff1a; 为每个单词构建一个密集向量&#xff0c;选择后…

傻白入门芯片设计,先进封装技术(五)

集成电路芯片与封装之间是不可分割的整体。没有一个芯片可以不用封装就能正常工作&#xff0c;封装对芯片来说是必不可少的&#xff0c;随着IC生产技术的进步&#xff0c;封装技术也不断更新换代&#xff0c;每一代IC都与新一代的IC封装技术紧密相连。 一、什么是封装&#xf…

什么蓝牙耳机颜值高音质好?颜值高音质好的蓝牙耳机推荐

朋友让我推荐蓝牙耳机的时候&#xff0c;总是喜欢问哪款蓝牙耳机的性能更强&#xff0c;想要直接入手那款性能更强的蓝牙耳机&#xff0c;以此节省对比的时间。但是用户自行进行对比的步骤&#xff0c;显然是不能省的&#xff0c;所以今天我给四款蓝牙耳机做了横向对比&#xf…

C语言tips-NULL指针和void指针

0.写在最前 最近因为工作需要开始重新学c语言&#xff0c;越学越发现c语言深不可测&#xff0c;当初用python轻轻松松处理的一些数据&#xff0c;但是c语言写起来却异常的复杂&#xff0c;这个板块就记录一下我的c语言复习之路 1. void指针 1.1 解释 void 用在函数定义中可以表…

身份安全风险分析

摘要 从勒索软件到 APT&#xff0c;身份风险是重要的攻击向量。 管理 Active Directory 的复杂性&#xff0c;导致所有组织都存在1/6的可利用的特权身份风险。 这些身份风险包括使用过时密码的本地管理员、具有不必要权限的错误配置用户、在终端上暴露的缓存凭据等。 当攻击者…

让学前端不再害怕英语单词(四)

|| 欢迎关注csdn前端领域博主: 前端小王hs || email: 337674757qq.com || 前端交流群&#xff1a; 598778642前三章直通车↓↓↓ 让学前端不再害怕英语单词&#xff08;一&#xff09; 让学前端不再害怕英语单词&#xff08;二&#xff09; 让学前端不再害怕英语单词&#xff0…

单目标应用:最有价值球员算法(Most Valuable Player Algorithm,MVPA)求解旅行商问题TSP

一、最有价值球员算法 最有价值球员算法&#xff08;Most Valuable Player Algorithm&#xff0c;MVPA&#xff09;由Bouchekara 等人于2017年提出&#xff0c;该算法受到体育比赛的启发&#xff0c;球员们为了赢得冠军而组成队伍进行队伍竞争&#xff0c;他们也为了赢得最有价…

使用VMware安装系统Window、Linux操作系统

使用VMware安装系统Window、Linux操作系统 下载镜像文件打开VMware 下载镜像文件地址或链接&#xff1a; Windows全家桶镜像文件下载网站&#xff1a;msdn.itellyou.cnWindows 10 种子文件 ed2k://|file|cn_windows_10_business_editions_version_1803_updated_aug_2019_x64_dv…