c++定制删除器

四、c++11智能指针之shared_ptr实现:自定义删除器 private ://指向计数器的指针 T * m_ptr;//多个智能指针对象共享一个引用计数,因此要定义为指针 size_t * m_size;//数组大小 std : : mutex * m_mutex;// 互斥锁,定义为指针类型,仅仅用来保护引用计数器 public ://构造 mySharedSp(const mySharedSp < T > & other); 阅读详情

定制删除器其实是利用仿函数

一、仿函数是什么?

不是函数但可以像函数一样使用,因为重载了operator()

简单举例:

template<class T>
struct Less
{
	bool operator()(const T& l, const T& r)
	{
		return l < r;
	}
};

void Test2()
{
	Less<int>less1;
	cout << less1(1, 2) << endl;
}

二、具体场景

void Teat()
{
	shared_ptr<FILE>spl((FILE*)fopen("test.txt", "w"));
}

上述场景中将产生错误,因为用fopen打开,要用fclose关闭

三、定制删除器举例

代码如下:

template<class T>//注意这里有模版
struct Del
{
	void operator()(const T* ptr)
	{
		delete ptr;
	}
};



struct Free//注意这里没有模版
{
	void operator()(void* ptr)
	{
		free(ptr);
	}
};



struct Fclose
{
	void operator()(FILE* ptr)
	{
		fclose(ptr);
	}
};


template<class T,class Deleter=Del<T>>
class SharedPtr
{
public:
	SharedPtr(T* ptr, Deleter del)
		:_ptr(ptr)
		, _pCount(new long(1))
		, _del(del)
	{}
	SharedPtr(T* ptr)
		:_ptr(ptr)
		, _pCount(new long(1))
	{}
	~SharedPtr()
	{
		_Release();
	}
protected:
	void _Release()
	{
		if (--*_pCount == 0)
		{
			_del(_ptr);
			delete _pCount;
		}
	}
private:
	T* _ptr;
	long* _pCount;
	Deleter _del;
};


测试用例:

void Test()
{
	SharedPtr<int>sp1(new int(1));
	SharedPtr<int,Free>sp2((int*)malloc(sizeof(int) * 10), Free());//注意怎么调用的
}


C++定制删除器 上一篇博客提到的智能指针采通过引用计数我们能解决多次释放同一块内存空间的问题,并且和之间直接移交管理权的方式比较这种方式更加灵活安全。但是这种方式也只能处理new出来的空间因为new要和析构中的delete匹配,为了使能和new,malloc,fopen的管理空间匹配,我们需要定制删除器#include<iostream> #include<stdlib.h> using namespace std 阅读详情

相关推荐

【C++】--遇到抛异常没有及时释放的空间该怎么办??---智能指针来帮你解决(以及定制删除器)

遇到抛异常没有及时释放的空间该怎么办??---智能指针来帮你解决(以及定制删除器)

qq_69369227的博客 392

C/C++ Qt ToolBar 菜单栏组件应用

ToolBar工具栏在所有窗体应用程序中都广泛被使用,使用ToolBar可以很好的规范菜单功能分类,用户可根据菜单栏来选择不同的功能,Qt中默认自带ToolBar组件,当我们以默认方式创建窗体时,ToolBar就被加入到了窗体中,一般是以QToolBar的方式存在于对象菜单栏,如下所示。实现顶部菜单栏二级菜单,二级顶部菜单与一级菜单完全一致,只是在一级菜单的基础上进行了延申,如下代码则是定义了一个二级菜单。事件,绑定到主窗口中,实现在窗体任意位置右击都可以弹出菜单栏,代码如下。还可以将顶部的菜单通过。

微软技术分享 1万+

STM32H7+LAN8720A之ETH与LWIP配置问题(End)

开篇介绍 由于项目中需要使用到STM32H7系列的芯片,且该系列无法移植ST的标准库,只能使用ST的HAL库,通过STM32Cube生成HAL库的基本代码。在项目开发中需要使用到STM32板载的ETH口,在简化的四层模型中充当着数据链路层的角色,我们只需添加PHY并配置好IP,即可实现基本的TCP主从机通信、UDP通信等等。 一、激光雷达3i-T1 由于使用了一款只具有网口通信的单线激光雷达,其具有TCP和UDP方式的通信方式,为了避免进行TCP中的socket报文解析和繁琐的通信握手过程,我们首先将雷达配

weixin_42024702的博客 1万+

【C++】定制删除器 + 类型转换

上一章节我们学习了智能指针,我们可以将对象托管给智能指针管理,通过智能指针来释放资源空间。但是每个资源的释放的方式是不一样的,而我们之前实现的智能指针释放资源的方式单一,那我们该如何解决呢?下面来絮叨絮叨~~🙋🙋🙋🙌传送门。

上上谦. 的博客 862

camera——HAL层知识分享

CameraHAL层是Android相机系统的核心中间层,负责连接Framework层与硬件驱动层。它通过标准化接口解耦软硬件,实现跨平台兼容性,同时为厂商提供硬件定制空间。主要功能包括:设备管理、数据流处理、参数控制以及图像优化。关键子系统涵盖预览、拍照、录像、对焦与曝光等模块,采用HAL3的"请求-响应"模型实现精细控制。性能优化重点关注启动时间、帧率稳定性和延迟控制。通过分层架构设计(接口层-核心层-适配层)和缓冲池机制,确保高效数据传输和硬件资源调度。

2302_77429403的博客 2074

Tessent ATPG进阶:解锁多种Fault Model的工程实践与选型指南

本文深入探讨Tessent ATPG中多种Fault Model的工程实践与选型策略,涵盖Stuck-at、Transition、Bridge等核心模型的应用场景与配置技巧。通过实际案例解析,展示如何组合不同Fault Model提升芯片测试覆盖率,特别针对汽车电子、超低功耗芯片等复杂场景提供专业解决方案。

weixin_30219613的博客 198

【C++高阶】:自定义删除器的全面探索

这篇文章主要是对之前智能指针的一个小小的补充,没有看过智能指针的读者朋友们,可以参考下下面这篇博客【C++高阶】:智能指针的全面解析-优快云博客int main()// 创建一个shared_ptr,管理一个打开的文件// 使用fclose作为定制删除器"test.txt"// 创建一个shared_ptr,管理一个打开的文件 // 使用fclose作为定制删除器 std::shared_ptr file (fopen( "test.txt" , "w" ), fclose);

island1314的博客 2211

STM32(H7)学习记录-14 XSPI连接DDR SDRAM(HyperBus)

主控芯片是STM32H7S7 ,HyperBusRAM芯片是W956D8MBYA5I。*DQS0(这个引脚是作为RWDS)使用的CubeMX版本是6.13.0。

m0_71918616的博客 1073

【C++】定制删除器和特殊类设计(饿汉和懒汉~)

为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有。

Sxy_wspsby的博客 1580

MT25QL256完整操作指南:从ID读取到4KB扇区擦除(附华大SPI例程)

本文提供了MT25QL256 NOR FLASH在华大MCU上的完整驱动开发指南。内容涵盖从SPI初始化、器件ID读取、状态寄存器查询,到核心的页编程和4KB扇区擦除操作,并分享了构建健壮驱动框架、处理跨页写入及常见调试问题的实战经验。

tt34567的博客 886

MaxENT生态位模型实战:从数据准备到论文发表的完整指南

本文提供MaxENT生态位模型从数据准备到论文发表的完整实战指南,涵盖物种分布数据处理、环境变量筛选、参数优化及结果可视化等关键步骤。特别介绍如何通过R语言进行高级建模优化,提升模型AUC值,并分享海洋生物专题研究中的数据处理技巧。适合生态学研究者快速掌握这一强大的物种分布预测工具,产出高质量研究成果。

tensor9flow的博客 302

C++ 定制删除器

定制删除器一般作用于shared_ptr和unique_ptr,当析构写死了delete的方式释放资源时,如果资源是new[]出来的(new数组),delete于new[]不匹配,会发生不可预知的错误,或者当资源是malloc出来的与delete也不匹配。所以要用定制删除器解决这个问题,这个定制删除器相当于仿函数,只需要当智能指针构造的时候同时传入仿函数(定制删除器即可)可以看出传了定制删除器后,针对不同的开辟资源的方式采用不同的释放方式,成功释放所有开辟出来的资源!首先明白我们用定制删除器是用来解决单一的

2401_83238095的博客 511

读懂 ABAP CDS 注解的直接、继承与派生

本文系统梳理了ABAP CDS注解的评估逻辑,重点解析直接注解(Direct)、继承注解(Inherited)和派生注解(Derived)的差异及其在CL_DD_DDL_ANNOTATION_SERVICE中的处理方式。通过视图注解@Metadata.ignorePropagatedAnnotations可调控注解传播行为,避免下游语义影响上层视图。文章还提供了基于标准表的完整示例(包含底层视图、消费视图和ABAP报告程序),帮助开发者在实际系统中验证三层注解的叠加效果与阻断机制。关键点包括:派生注解的数据

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 245

C++中智能指针与动态内存管理的高级实践从unique_ptr到定制删除器的深度探索

动态内存管理在C++中历来是开发者的挑战,而智能指针通过将内存分配与对象生命周期绑定,显著提高了代码的安全性和可维护性。此外,C++17引入了std::pmr(多态内存资源)与智能指针的集成,进一步简化了动态内存管理的定制化。例如,对于使用特殊分配器分配的内存,或需要调用特定清理函数(如fclose for FILE)的资源,定制删除器提供了灵活性。对于unique_ptr,删除器类型是模板参数的一部分,这允许编译器进行优化,但也会影响类型唯一性。例如,两个具有不同删除器类型的unique_ptr。

subzero88的博客 459

红米K70至尊版修复“nv损坏”主板电阻图示 mtk芯片工程固件刷写与步骤说明

💝💝💝红米K70至尊版 机型代码:rothko,搭载天玑9300+旗舰芯片.后置5000万像素索尼IMX906高动态OIS主摄,800万像素超广角镜头,200万像素微距镜头,前置2000万像素摄像头,也适用于以下型号的小米机型:2407FPN8EG,2407FPN8ER,XIG06,A402XM,2407FRK8EC。 💝💝💝通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝💝-----此机型刷写工程固件预览界面 3💝💝💝------红米K

小马哥的专栏 1461

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++的RAII思想、智能指针类、shared_ptr的循环引用问题、定制删除器(重要)

C++11并没有类似boost库中提供的shared_array智能指针类用于管理和释放由[ ]创建的多个智能指针对象,所以在使用shared_ptr管理和释放由[ ]开辟的多个对象时,会因为delete与new的方式不匹配而报错。可以有多个指向相同资源的指针,资源管理依赖于引用计数,因此必须小心循环引用问题,避免资源无法释放。2、weak_ptr也有use_count接口,用于获取此时weak_ptr指向的资源的引用计数。的资源并增加引用计数,一些列操作导致int资源的引用计数不变,相当于什么都没干。

m0_73975164的博客 870

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++智能指针定制删除器(解决资源释放不匹配问题)

但是其提供了一个仿函数接口,我们可以根据不同的对象实现匹配的删除器。可以发现 通过仿函数的方式定制了匹配的删除器,可以解决上述问题!引发了异常,这是因为智能指针默认的删除器不匹配导致的异常!我们可以传一个仿函数过去 与之匹配。

广西彭于晏的博客 529

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++智能指针定制删除器

智能指针的自定义删除器扩展了智能指针的功能,使其不仅可以管理内存,还能管理文件句柄、套接字、数据库连接等资源。unique_ptr支持自定义删除器作为模板参数。C++智能指针定制删除器。

2501_94114815的博客 176

C++智能指针:原理、演进、线程安全与定制删除器详解

本文内容包括智能指针使用的场景以及智能指针呗开发出来的背景、智能指针的概念、智能指针的思想和原理、智能指针的发展历史、boost拓展库的由来、auto_ptr、unique_ptr、shared_ptr的设计思路以及代码实现。

2302_80475369的博客 1162

【C++】模拟实现定制删除器

在上一篇博客中,我们模拟实现了几种智能指针,这里我们在自己模拟实现的SharedPtr的基础上,分别利用仿函数和函数指针来定制删除器。 为什么要定制删除器呢,如果我们用new开辟空间,那么需要用delete来释放,如果用fopen打开一个文件,那么我们需要用fclose来关闭,同理malloc与free对应,如果不匹配使用,那么程序就有可能会崩溃。 1.利用函数指针的方法 使用模板函数,在S

Cheng_913的博客 509

现代C++⊂C++11篇(六)智能指针演进与手写shared_ptr:从RAII到定制删除器

本文围绕C++智能指针的演进与实现展开。从RAII思想切入,梳理auto_ptr的致命缺陷、unique_ptr的独占改进,再到shared_ptr的共享设计。重点手写shared_ptr核心:引用计数管理、拷贝构造、赋值运算符重载及析构逻辑,并引入function包装器实现灵活的定制删除器。通过逐行构建,读者可透彻理解智能指针的底层机制,为后续攻克内存碎片化、循环引用及线程安全等工程难题打下坚实基础。

沫漓的博客 421

C++ - 智能指针的定制删除器

在上一篇C++ 文章当中,对 智能指针的使用,做了很详细的介绍,对 C++11 和 C++98 库当中实现的一些常用智能指针做了很详细的介绍,但是智能指针的使用还有一些拓展用法。

chihiro1122的博客 683

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

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

xiao_xiao21的博客 710

智能指针与定制删除器

下面我们就可以写我们的定制删除器,那么我们想要该类再析构的时候调用可调用对象来析构,那么当然是我们再构造的时候,或者是模板的时候就传进入一个仿函数,或者是再构造函数的时候再传入可调用对象,但是STL 库里面是再构造函数的时候传入的,所以我们也在构造函数的时候传入。这里为了支持我们的写入,我们需要提供一个 getPtr 因为我们写入的时候,需要文件指针,而我们需要提供getPtr 或者是将 _ptr 放成公有,才可以,这里选择提供getPtr。那么如果我们想要 new[] 呢?那么我们如何保存呢?

m0_73455775的博客 237

shared_ptr之定制删除器

shared_ptr是用来管理多种资源的,而我们现在往往会误认为用来管理动态开辟的内存空间,像是打开文件(fopen)、malloc等多种情况,也需要shared_ptr来管理,因此,我们便需要定制删除器。template<class T> class Free { void operate()(T* _ptr) { free(_ptr);

weixin_35140291的博客 1008

利用仿函数实现定制删除器

1.仿函数首先我们需要知道什么是仿函数。 仿函数:仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。 示例:#include<iostream> #include<cstdlib>using namespace std; class Print { public: void opera

宇哲 652
上一篇: c++继承与组合
下一篇: C语言实现顺序表
Everlasting2016
博客等级 码龄11年 22粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值