旧项目内存泄漏修复

C++中内存泄漏的Valgrind检测与修复 摘要:本文详细介绍了如何使用Valgrind工具检测和修复C++程序中的内存泄漏问题。主要内容包括:1) Valgrind的安装与基本使用方法;2) 通过添加调试信息编译程序并运行检测;3) 分析典型输出示例;4) 常见内存泄漏场景(显式分配未释放、类成员指针泄漏等)及其修复方案;5) 最佳实践建议,如使用智能指针和遵循RAII原则。文章提供了详细的代码示例和修复对照表,帮助开发者系统性地解决内存管理问题,提升程序稳定性。 阅读详情

有个旧项目内存泄漏问题,用的是viewpager,页面多次跳转后,内存明显一直在增长,最后发现是viewpager中对fragment的引用导致

所以需要对adapter进行改造,不直接引用fragment,而是fragment的class


 

open class FragmentPagerAdapter : FragmentStatePagerAdapter {
    var fragmentClass: List<Class<*>> = emptyList()
    var titles: List<String>? = null

    constructor(fm: FragmentManager, list: List<BaseFragment>, titles: List<String>?) : super(fm) {
        this.titles = titles
        this.fragmentClass = list.map {
            it.javaClass
        }
    }

    constructor(fm: FragmentManager) : super(fm)


    override fun getItem(position: Int): Fragment {
        childCount = position

        return (fragmentClass.get(position).newInstance() as BaseFragment) //反射加载Fragment

    }

    override fun getCount(): Int {
        return fragmentClass.size
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return titles!![position]
    }

    var childCount: Int = 0
    override fun getItemPosition(`object`: Any): Int {

        return super.getItemPosition(`object`)
    }

    override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
        super.destroyItem(container, position, `object`)
    }
}

改造之后,页面跳转内存就平稳了

如何使用 WinDbg 修复 C/C++ 中的内存泄漏 它是 Microsoft 提供的适用于内核和用户空间的强大调试器,也是查找内存泄漏的绝佳工具。Deleaker 有一个直观的 UI:开发人员不需要知道无限的命令列表来重复键入它们,希望找到泄漏内存的地址。它是一个带有 GUI shell 的控制台应用程序,一个强大的调试器,只要您知道正确的命令即可。此外,您无权访问源代码。有了泄漏内存的地址,我们可以使用 WinDbg 的强大功能来获取每个特定内存分配的调用堆栈。通过一些努力,即使在具有大量代码库的最复杂的本机应用程序中,也可以减少或消除内存泄漏的数量。 阅读详情

相关推荐

浏览器内存泄漏如何分析与修复指南

浏览器内存泄漏分析与修复指南

T_iAn_T的博客 1123

FragmentStatePagerAdapter使用不当引起的内存泄漏问题

FragmentStatePagerAdapter使用不当引起的内存泄漏问题 首先来看看问题的复现的代码 class InnerPagerAdapter( fm: FragmentManager, private val fragments: ArrayList<out Fragment>, private val titles: List<CharSequence> ) : FragmentStatePagerAdapter(fm) { overr

TE28093163的专栏 4157

如何使用 pprof 简单检测和修复 Go 中的内存泄漏

使用 Go 的pprof包可以方便地启用性能分析,并通过 HTTP 接口收集堆内存、CPU 性能等数据。可以通过工具分析内存泄漏和性能瓶颈,定位可能的问题。常见的内存泄漏问题包括:长期持有对象、Goroutine 泄漏、未关闭的通道等。通过修复内存泄漏,可以有效地减少内存占用和提高程序的稳定性。使用pprof可以帮助你更好地诊断和修复 Go 中的内存泄漏,提高应用程序的性能和稳定性。

每日一贴 2002

Android Navigation 解决 Adapter内存泄漏

Android 使用Navigation时因为View生命周期和Fragment生命周期不同步 很多地方会导致内存泄漏 这里介绍的是RecyclerView内存泄漏的解决方法

qq_39178733的博客 1550

C++中内存泄漏的检测与修复方法

防御性编程三原则所有权明确:每个动态分配的内存必须有明确的释放路径异常安全:确保所有退出路径都能释放资源最小化裸指针:优先使用智能指针和标准库容器代码审查清单✅ 所有newmalloc是否有对应的deletefree?✅ 析构函数是否完整释放所有资源?✅ 容器是否存储原始指针?✅ 是否存在循环引用?性能优化建议对高频分配的场景,使用内存池技术:class MemoryPool {public:if (!return ptr;C++内存泄漏的本质是资源生命周期管理不当。

shejizuopin的博客 859

内存泄漏中JVM调优错误的报错与修复

本文探讨了Java应用程序中内存泄漏导致的JVM调优错误及其解决方案。内存泄漏表现为内存占用持续增长和频繁GC操作,最终引发OutOfMemoryError。修复方法包括:合理设置堆内存参数(-Xms/-Xmx)、选择合适的垃圾回收器(如G1GC)、加强监控(使用jstat/jmap等工具)、使用MAT分析堆转储文件定位泄漏点,以及修复代码中的常见泄漏原因(静态集合、未关闭资源等)。文中还提供了代码示例和修复方法对照表,帮助开发者快速定位和解决内存泄漏问题。

shejizuopin的博客 1198

使用FragmentStatePagerAdapter时发现的内存泄露问题

这篇文章想说的并非是由于使用 FragmentStatePagerAdapter 而导致的内存泄漏,内存泄漏的真正原因和 FragmentStaePagerAdapter 并无直接关联,但是使用 FragemntStatePagerAdapter 能让你更加直观的发现内存泄漏。 我先说说我之前遇到的问题。我们都知道,当使用 FragmentSataePagerAdapter 的...

weixin_30682415的博客 1831

【QT开发教程】Qt中的内存泄漏检测与修复

内存泄漏是指程序在动态分配内存后未能正确释放,导致内存无法被重新分配和使用。内存泄漏会导致程序的内存使用量不断增加,最终可能导致程序崩溃。Qt提供了一些工具和方法来检测和修复内存泄漏。本文将介绍Qt中的内存泄漏检测与修复方法,帮助开发者提高程序的稳定性和性能。

科技改变人类,技术成就未来 1119

Android 性能优化之内存泄漏的检测与修复

转载请注明本文出自 clevergump 的博客:http://blog.youkuaiyun.com/clevergump/article/details/52013873, 谢谢!在 Android 开发中, 内存优化是APP性能优化中很重要的一个部分. 而在内存优化中, 最重要的就是修复内存泄漏问题. 本文就来介绍一下内存泄漏的基本概念以及常用的检测手段.1. 什么是内存泄漏简单来说, 当一个对象不再被使

clevergump的专栏 7736

AT91SAM9260搭建LINUX操作系统

一、 编写目的 2 二、 系统搭建 2 1. 下载相关软件包 2 2. Bootstrap编译 3 3. U-BOOT编译 5 4. LINUX编译 7 5. 通过U-BOOT的TFTP命令从TFTP服务器下载系统镜像 9 6. 文件系统制作 10 7. 挂载NFS作为根文件系统 10 三、 总结 14 一、编写目的 本文档用于记录AT91SAM9260 LINUX学

lshiceman的专栏 7415

MATLAB控制信号发生器(USB-GPIB-HS)GPIB仪器控制教程(含matlab代码)

自动化测试时需要自动产生信号,通过matlab控制信号发生器的频率与功率,以实现自动化信号生成输出

qq_43686057的博客 1606

如何用AI自动修复内存泄漏问题

内存泄漏问题虽然棘手,但借助AI工具,我们可以更高效地定位和修复它。无论是个人项目还是团队协作,AI辅助开发都能显著提升代码质量和开发效率。如果你也遇到过内存泄漏的困扰,不妨尝试用AI工具来优化你的开发流程。

NightshadeRaven21的博客 1054

Ubuntu升级遇到grub-efi-amd64-signed安装失败?3步搞定这个烦人错误

本文深度解析Ubuntu系统升级时grub-efi-amd64-signed安装失败并提示“cannot find EFI directory”错误的根本原因。该错误通常由EFI系统分区挂载异常、BIOS/UEFI引导模式不匹配或dpkg包状态死锁导致。文章提供了三步精准修复流程:首先检查并修复ESP分区挂载,其次处理dpkg依赖问题,最后针对传统BIOS系统提供适配方案,帮助用户安全彻底地解决这一常见升级难题。

r7s8t的博客 398

内存泄漏修复示例

集成LeakCanary工具后,开发者可以检测并修复Android应用中的内存泄漏问题。LeakCanary通过弹窗提示内存泄漏,并生成详细的泄漏日志,帮助开发者定位问题。本文列举了1.0版本中检测并修复的多个内存泄漏示例,包括非静态内部类持有外部类引用、匿名内部类隐式持有Fragment引用、静态变量持有Fragment引用、服务广播未解绑、播放器SubtitleView未释放以及Handler未取消消息等。针对这些问题,提出了相应的修复方案,如将内部类改为静态类并使用弱引用、在Fragment销毁时断开

github_35581409的博客 847

土壤水动力学_前 言

Van Genuchten (V-G) 模型是土壤水分特征曲线中最常用的模型之一。它通过数学方程描述了土壤基质吸力与体积含水量之间的关系,被广泛应用于土壤水分运移、土壤盐渍化、边坡稳定性等研究领域。V-G模型是描述土壤水分特征曲线的重要工具,但它并不是完美的。在实际应用中,需要根据土壤类型、试验条件等因素选择合适的模型。土壤基质吸力是土壤水分学中的一个重要概念,它对土壤水分的保持、植物的生长以及土壤的工程性质都有重要影响。

weixin_44259522的博客 5335

RIGOL DS1102E示波器新手必看:从开机到捕获第一个波形的5分钟指南

本文为RIGOL DS1102E示波器新手提供了一份快速上手指南。内容涵盖从开机、探头校准到捕获第一个波形的完整流程,重点解析了触发设置、自动测量等核心操作,并指出了探头衰减比设置等常见误区,帮助用户快速掌握这款经典数字示波器的基本使用方法。

dream的博客 742

Golang 内存泄漏详解:原因、检测与修复

在编写Golang程序时,内存泄漏是一个常见但容易被忽视的问题。虽然Golang有自动垃圾回收机制,但在特定情况下,内存泄漏仍然可能发生。本篇博客将深入探讨Golang中的内存泄漏,包括其定义、常见原因、检测方法、预防措施以及实际案例分析。

hello.reader 3277

信噪比(Signal-to-Noise Ratio, SNR)详细介绍

信噪比(Signal-to-Noise Ratio,SNR)是衡量信号质量的重要参数,表示有用信号的功率与背景噪声功率的比值。其中,\( P_{\text{signal}} \) 表示信号功率,\( P_{\text{noise}} \) 表示噪声功率。- 音频处理:在音频设备和录音系统中,SNR决定了音质的好坏,高SNR表示音频信号更清晰,噪声更少。- 低SNR:信号中噪声成分较大,接收端难以分辨有用信号和噪声,可能导致误码率高,通信质量差。SNR定义为信号功率与噪声功率之比,通常用分贝(dB)表示。

qq_58860480的博客 8万+

ExifToolGui项目中ShellListView内存泄漏问题的分析与修复

ExifToolGui项目中ShellListView内存泄漏问题的分析与修复 在ExifToolGui项目中,开发团队发现并修复了ShellListView组件(TShellListView)存在的内存泄漏问题。这类问题在文件管理类应用中尤为关键,因为频繁的文件列表操作可能导致内存持续增长,最终影响应用性能。 问题背景 ShellListView组件是Windows Shell API的封装,用...

gitblog_07166的博客 417

量化实战:用三种波动率模型给你的期货策略做个“体检”(附Python代码与螺纹钢案例)

本文深入探讨了三种专业波动率模型(Parkinson、Garman-Klass和Rogers-Satchell)在期货量化策略中的应用,并以螺纹钢期货为例,展示了如何通过Python实现这些模型进行多维度波动率分析。文章详细比较了不同模型的特点和适用场景,提供了动态仓位管理、止损策略优化等实战应用方案,帮助交易者更精准地评估市场风险,优化策略表现。

weixin_26824299的博客 460

Orange3实战教程:文本挖掘---主题建模

主题建模通过LDA、LSI或HDP算法分析文档集合,自动发现隐含主题结构。组件输入为文档语料库,输出包括带主题权重的语料库、主题词分布及完整主题数据。不同算法特性各异:LSI允许正负权重但解释性较弱,LDA更易解释,HDP参数复杂需谨慎设置。结果可结合词云、热力图等可视化工具分析主题特征及分布。示例显示如何通过预处理文本、选择算法(如提取5个LDA主题),并利用MDS和箱线图探索主题间关系及关键词分布。

err2008的专栏 366

如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践

原文来自互联网,由长沙DotNET技术社区编译。本文来源:https://michaelscodingspot.com/find-fix-and-avoid-memory-leaks-i...

dotNET跨平台 1万+

深度学习工具包 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")

如何修复 React 中的内存泄漏

React 内存泄漏会影响应用程序的性能。阅读更多内容以了解 React 中的内存泄漏,并了解修复内存泄漏的三种不同方法。

没有酒也没有故事。 2752

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

全面解析内存泄漏检测与修复技术

内存泄漏是在没有自动gc的编程语言里面经常发生的问题;因为没有gc,所以分配的内存需要程序自己调用释放。其核心是调用分配与释放没有符合开闭原则,没有配对,形成了有分配,没有释放的指针,从而产生了内存泄漏。以上代码段,分配了两个s1大小的内存块,由 p1 与 p2 指向。而代码块执行完以后,释放了 p1,而 p2 没有释放。形成了有分配没有释放的指针,产生了内存泄漏。Linux中有两个宏__FILE____func__和__LINE__

weixin_51458682的博客 846

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

xLua内存泄漏修复案例:Unity Lua项目的问题解决实例

在Unity游戏开发中,内存泄漏(Memory Leak)是一个常见且棘手的问题。尤其当项目采用xLua(Lua编程解决方案)进行开发时,C#与Lua两种语言的内存管理机制差异可能导致更复杂的内存泄漏场景。本文将通过一个真实案例,详细介绍如何诊断和修复xLua项目中的内存泄漏问题,帮助开发者掌握实用的分析方法和解决方案。 读完本文后,你将能够: - 理解xLua中内存泄漏的常见原因 - 掌握Un...

gitblog_00325的博客 685

小记内存泄漏修复

小记内存泄漏修复 服务总是在一个月左右内存溢出,导致服务宕机,Xshell直接连不上。1、下载了内存泄漏检测工具进行检测,然而一无所获,未能定位到问题所在;2、对可能出问题的的代码进行复核,是否存在相关引用或资源没有回收;确定是否存在递归或者死循环等不断的消耗内存;3、记录服务器多天内存情况、线程情况进行比对,确认是线程不断累积造成;4、定位代码:一发送消息接口内部定义了线程池,导致在发消息的同时不断的累积线程,最终超出阀值进而导致内存溢出。 一、OutOfMemoryError: PermGen spac

weixin_39617267的博客 1042
上一篇: 动不动就要收费,pdf拆分python脚本
下一篇: Android studio取消代理
lynn8570_blog
博客等级 码龄10年 254粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值