用V C++检测和隔离内存泄漏

C++ 内存泄漏检测:valgrind和AddressSanitizer 推荐使用工具valgrind,安装: sudo apt install valgrind #debian/ubuntu 内存泄漏示例代码如下: /* code with memory leak */ #include <stdio.h> #include <stdlib.h> int main(void) { int *ptr = (int*)malloc... 阅读详情

 用V C++检测和隔离内存泄漏

  具有动态的分配和释放内存的能力是C/C++程序语言的重要特色之一。Visual C++ debugger 和 CRT库提供了一系列有效的检测和鉴定内存泄漏的工具。

  设置内存泄漏检测

  检测内存泄漏的基本工具是调试器和CRT调试堆函数。为了使用调试堆函数,在你的程序中你必须含有下面的说明:
  #define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>

  #include说明必须按顺序说明。如果改变了顺序,所用的函数可能不能正常工作。包含crtdbg.h的_malloc_dbg和 _free_dbg将 malloc和free函数映射到测试版中,它可以跟踪内存的分配和释放。这种映射仅仅在一个测试体系中发生(也就是说,仅仅当_DEBUG被定义的时候)。释放的体系使用通常的malloc和 free功能。

  #define说明映射CRT堆函数的低级版本到相应的测试版本。这个说明是不需要的,但是没有它,内存泄漏处含有的只是没有多大用处的信息。

  一旦你已经增加了刚才的说明,你能够通过在你的程序中包含下面的说明来释放内存信息:
  _CrtDumpMemoryLeaks();

  当调试情况下运行程序时,在输出窗口的Debug 标签处_CrtDumpMemoryLeaks表现出内存泄漏的信息。内存泄漏信息类似下面这样:
Detected memory leaks!
Dumping objects ->
C:/PROGRAM FILES/VISUAL STUDIO/MyProjects/leaktest/leaktest.cpp(20) : {18} normal block at
0x00780E80, 64 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

  如果你没有用#define _CRTDBG_MAP_ALLOC说明,内存漏洞堆存处类似下面这样:
Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

  当_CRTDBG_MAP_ALLOC被定义时,_CrtDumpMemoryLeaks给了你更多的有用信息。如果_CRTDBG_MAP_ALLOC没有被定义,那么将向你如下显示:

  内存分配数值(花括号内)
  模块的类型(normal、client或者CRT)
  以十六进制格式定位的内存
  以字节计模块的大小
  第一个十六字节的内容(也可以用十六进制)
  当定义了_CRTDBG_MAP_ALLOC的时候,显示的内容也向你展现了出现泄漏内存所分配地方的文件。在文件名之后括号内的数字(20,以此为例)是文件内的行数值。如果你双击包含行数值和文件名的输出行,
  C:/PROGRAM FILES/VISUAL STUDIO/MyProjects/leaktest/leaktest.cpp(20) : {18} normal block at
0x00780E80, 64 bytes long.

  指针将会跳到源文件中内存被分配地方的行(在上面的情况下,leaktest.cpp的行号为20)。选择输出行并按F4将有同样的效果。
  使用_CrtSetDbgFlag
  如果你的程序总是在同一各地方存在,那么调用_CrtDumpMemoryLeaks时非常容易的。但是,如果你的程序需要在多个位置退出该怎么办?在每一个可能的出口处如果不调用_CrtDumpMemoryLeaks,你可在你的程序开始处包含下面的调用:
  _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
  当程序退出时,这个说明自动地调用_CrtDumpMemoryLeaks。你必须设置两个位域,_CRTDBG_ALLOC_MEM_DF和 _CRTDBG_LEAK_CHECK_DF。

  翻译内存模块的类型
  内存泄漏信息鉴别泄漏内存的每一个模块作为一个普通的模块、一个客户模块或者一个CRT模块。实际上,普通的模块和客户模块是你可能留心的唯一类型。
  一个普通模块(normal block)是由你的程序分配的普通内存。
  一个客户模块(client block)是一种特殊的内存模块,它由于需要一个析构函数的对象而被Microsoft Foundation Classes (MFC)所使用。MFC new操作子建立一个普通模块或者一个客户模块,来适合被创建的模块。
  一个CTR模块是由CRT库提供自己使用而分配的内存模块。CRT库对这些模块来管理自己的去分配,因此你不可能在内存泄漏报告中注意到这些,除非有些地方有严重的错误(例如,CRT库崩溃)。
  在内存泄漏信息中有两种你从来没有见过的模块类型:
  空闲模块(free block)是一种被释放的内存模块
  Ignore block是你已经特殊标记过以至于在内存泄漏报告中不会出现的模块。

  设置CRT报告样式
  像以前的一样,按默认方式,_CrtDumpMemoryLeaks倾卸内存泄漏信息到输出窗口的Debug窗格。你可以运用_CrtSetReportMode重新设置它到堆存处,到另一个位置。如果你使用一个库,它可能重新设置输出到另一个位置。在这种情况下,你能够利用下面的说明来设置输出位置回到输出窗口:
  _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
  关于使用_CrtSetReportMode去发送输出信息到另一个位置,要看Visual C++文件的_CrtSetReportMode节。

  在内存分配数目处设置一个断点
  在内存泄漏报告中的文件名和行号可告诉你泄漏的内存在那里被分配,但是了解内存在那里分配对于鉴定问题不总是充分的。在一个程序运行过程中,经常是一个分配将会被调用很多次,但是它可能在某次调用中泄漏内存。为了确定问题,你必须不但知道泄漏的内存在那里分配,还要知道泄漏发生的条件。对你来说,使它成为可能的那条信息是内存分配号。当那些被显示的时候,文件名和行号之后,这是在curly brace中出现的数值。例如,在下面的输出中,"18"是内存分配号。它的意思是泄漏的内存是你程序中内存分配的第十八个模块。
Detected memory leaks!
Dumping objects ->
C:/PROGRAM FILES/VISUAL STUDIO/MyProjects/leaktest/leaktest.cpp(20) : {18} normal block at
0x00780E80, 64 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

  CRT库计算在程序运行期间分配的所用内存模块,包括CRT自己分配的内存或者诸如MFC的其它模块。因此带有分配号n的一个对象是在你的程序中分配的第n个对象,但不可能是由代码分配的第n个对象。(在大部分情况下,它是不会的。)

  你可以利用分配号在内存分配的地方设置一个断点。为了做这些,你可以距离你的程序开始很近处,设置一个位置断点。当你的程序在那一点暂停时,你能够从QuickWatch对话框或者Watch窗口设置这样一个位置断点。例如,在Watch窗口中,在Name栏键入下面的表达式:
_crtBreakAlloc

  如果你正在用CRT库的多线程的dynamic-link library (DLL)版本,你必须含有上下文操作符,像这里说明的:
{,,msvcrtd.dll}_crtBreakAlloc

  现在,按RETURN。调试器评估调用并且把结果放置在Value栏。如果你在内存分配过程中还没有设置任何断点,那么这个值是-1。使用你想中断处内存分配的分配数值来代替Value表中的值--例如,18 去中断早期在输出过程中展现的分配。

  当你在你感兴趣的内存分配处设置断点之后,你能够继续调试。在与从前相同的条件下,运行程序时一定要小心,因而分配的顺序不会改变。当你的程序在一个特殊的内存分配点中断的时候,你能够查看Call Stack窗口和其他的测试信息来确定在此条件下内存的分配。如果需要的话,你可以继续从那一点执行程序,以至于了解对象到底发生了什么事,同时还可能确定为了没有正确地被去分配。(对对象设置一个数据断点是很有帮助的。)

  虽然在调试器中设置内存分配断点通常更加容易,但是如果你喜欢的话,你可以在你的代码中设置它们。为了在你的代码中设置一个内存分配断点,可以增加这样一行(对于第十八个内存分配):
_crtBreakAlloc = 18;

  最为一个选择,你可以使用有相同效果的_CrtSetBreakAlloc函数。
_CrtSetBreakAlloc(18);

  比较内存状态

  定位内存泄漏的另一个方法就是在关键点对应用程序的内存状态做快照。CRT库提供了一个结构类型,_CrtMemState。你可以使用它来存储内存状态的一个快照。
_CrtMemState s1, s2, s3;

  为了在特定点对内存状态进行快照,可以传递一个_CrtMemState结构到he _CrtMemCheckpoint函数。此函数用当时内存状态的一个快照来填充此结构:
_CrtMemCheckpoint( &s1 );

  你可以通过传递此结构到_CrtMemDumpStatistics函数来倾卸_CrtMemState结构的任意点的内容:
_CrtMemDumpStatistics( &s3 );( &s1 );

  此函数打印出类似于下面这样的一堆内存分配信息:
0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
3071 bytes in 16 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 3071 bytes.
Total allocations: 3764 bytes.

  为了确定一个内存泄漏是否在一节代码中出现,你可以在此节前和此节后对内存状态作快照,然后用_CrtMemDifference比较两种状态:
_CrtMemCheckpoint( &s1 );
// memory allocations take place here
_CrtMemCheckpoint( &s2 );

if ( _CrtMemDifference( &s3, &s1, &s2) )
   _CrtMemDumpStatistics( &s3 );

  像名字暗示的一样,_CrtMemDifference比较两个内存状态(最先的两个参数)并且产生一个不同于这两个状态的结果(第三个参数)。在你的程序开始和结尾处的_CrtMemCheckpoint调用和使有_CrtMemDifference来比较结果为检测内存泄漏提供了另一种方法。如果一个泄漏被检测到,那么可以使用_CrtMemCheckpoint调用来分割你的程序并且使用二元binary search technique来定位泄漏。 

 

 
VS检测内存泄漏,定位泄漏代码位置方法 1、什么是内存泄漏? 内存泄漏指的是在程序里动态申请的内存在使用完后,没有进行释放,导致这部分内存没有被系统回收,久而久之,可能导致程序内存不断增大,系统内存不足……引发一系列灾难性后果;(关于程序申请内存分配方式,详见:内存分配方式) 2、零容忍 排除内存泄漏对于程序的稳健型特别重要,尤其是程序需要长时间、稳定地运行时。C++这类动态内存申请释放都是由程序员控制的语言,稍不注意,很有可能就... 阅读详情

相关推荐

C/C++内存管理——内存泄漏/内存碎片

内存泄漏通常发生在动态分配的内存上,如果这部分内存没有被正确释放,随着时间的推移,越来越多的内存将被占用,最终可能导致程序运行缓慢或者崩溃。直接点说:只需在构造函数中设置好内存分配的代码,并在析构函数中设置好内存释放的代码,后面创建对象,系统自动调用构造函数和析构函数,无序程序员特别留意程序内存安全性,方便后续程序编写。C++11 引入了智能指针,如 std::unique_ptr 和 std::shared_ptr,它们可以在对象不再使用时自动释放内存,从而避免内存泄漏。

鲸落博客 2932

《进程隔离机制:C++多进程编程安全的坚固堡垒》

比如在一个企业级的文档管理系统中,不同的进程分别负责文档的上传、下载和审核等功能,进程隔离确保了只有审核进程能够对文档的审核状态进行修改,上传和下载进程无法越权操作,保障了文档管理流程的安全性和规范性。例如,在一个面向互联网的 C++多进程服务应用中,当其中一个对外提供服务的进程被黑客发起缓冲区溢出攻击时,进程隔离机制能够限制攻击的影响范围,使得黑客无法利用该进程轻易地获取系统中其他关键进程的权限,从而为系统管理员争取到时间来检测和应对攻击,降低了整个系统被攻破的风险。

xy520521的博客 827

关于C/C++中的内存泄漏——程序员面试高频题

前几天面试多益网络的时候,面试官就问到了C/C++中的内存泄露问题。这也是很多公司面试时候的高频题,好吧,那就来学习下吧~ 到底什么是内存泄漏?是什么导致了内存泄漏?如何避免?又如何检测呢? 1)什么是内存泄漏? 简单来讲,内存泄露是指程序中一块不再使用的内存没有被释放,造成内存保持占用状态,使操作系统不能将内存分配给其它的程序(进程)。内存泄露不是一个立即会引发故障的错误,但是它将

生命不息,奋斗不止,女神经程序员进阶ing 4253

入门设计原则C++实现三:接口隔离原则

在下面例子中,IBehavior类是接口类,fish和bird类继承自该类并使用该类提供的接口(客户端依赖接口),但是在第一份代码中,客户端如鱼类依赖了它不需要的接口(fly方法),因此违背接口隔离原则中的“客户端不应该依赖它不需要的接口”。臃肿(多余方法)接口设计,称之为胖接口,一点接口方法变动,会影响所有实现该接口的客户端类程序,比如当在行为类中增加新的动作接口时,如“爬行”,需要在所有派生动物类中重写爬行方法,耦合度过高。接口一种约束形式,为不相关的类提供约定好的处理方法;.........

鲁点点的博客 982

[0352]基于JAVA的停车场收费智慧管理系统的设计与实现

其次,从经营管理层面考虑,本系统涵盖了丰富的月卡管理和财务结算功能,如月卡用户管理、缴费、注销、挂失、解挂、补办等全流程服务,以及临保和月保的结算汇总与欠费查询等功能,这不仅有助于规范停车场的日常运营管理,更能有效提高财务管理效率,降低运营成本,实现精细化、数字化的财务管控。综上所述,本课题计划研发的基于Java的停车场收费智慧管理系统将在现有研究成果的基础上,重点优化月卡用户全生命周期管理和财务统计分析功能,以满足现代停车场高效、精准、安全的管理需求,紧跟行业发展趋势,为推动智慧城市的建设贡献一份力量。

muyu2980的专栏 590

zabbix6.0.4拓扑图链路显示流量

1. 背景介绍 网络流量监控是网络管理员必备功课,以前研究cacti的weathermap插件,网络流量大小和拥塞情况一清二楚,随着cacti的没落,weathermap插件也不能再继续使用,此时就需要学习了解新的替代方案。 经过研究和实际测试,发现zabbix的拓扑图有这个功能。 以下验证了zabbix的拓扑图显示线路流量的功能。 2. Zabbix 6显示拓扑图流量过程 选择监测-拓扑图 点进Local ne...

u013930899的博客 8487

c++编程, 解除文件间的依赖关系,接口隔离原则

c++编程, 解除文件间的依赖关系,接口隔离原则 这里所指的接口隔离,是把不同的接口包在不同的文件中.相关联的接口包在一个文件中. 我曾经贪图方便,使用过集中管理的方式. 集中管理的全局变量 global.h,global.cpp 集中管理的全局函数 subs.h subs.cpp 所有的全局变量放在一个文件中叫global.cpp 其对应的头文件是global.h, 用以对外声明全局变量,...

hjjdebug的专栏 1176

VL53L1X移植到STM32实战记录,使用软件IIC(附源代码)

序言 VL53L1X是一个很小又很优秀的测距传感器,它相比于上一代VL53L0X有着不小的提升,这次毕业设计打算将这个传感器用起来,就来移植了一下,遇到的坑怎么说还是有一些,故在此分享给大家。 开发环境 IDE:Keil V5 STM32CubeMX ,使用HAL库 具体操作 获取官方库并进行移植 这一步是移植的基础,首先从官方把API库下下来,并添加到IDE中: 适配硬件 这里由于不同的硬件平...

wmdscjhdpy的博客 1万+

Dlib:训练Dlib识别人脸器官部位上的特征点

日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 1,了解iBUG 300-W数据集,该数据集是用于训练形状预测器的通用数据集,该预测器用于定位人脸的特定位置(即面部标志)。 2,训练自己的自定义dlib形状预测器,从而生成一个可以平衡速度,准确性和模型大小的模型。 3,最后,我们将形状预测器进行测试并将其应用于一组输入的图像/视频流,这表明我们的形状预测器能够实时运行。 https://ibug..

あずにゃん梓喵的博客 2549

Vivado实战:UltraScale/UltraScale+器件eFUSE寄存器配置与安全编程全解析

本文详细解析了Xilinx UltraScale/UltraScale+器件中eFUSE寄存器的配置与安全编程方法。从芯片唯一身份标识到加密密钥烧录,再到用户寄存器的灵活应用和安全控制寄存器的配置技巧,全面介绍了如何利用eFUSE功能提升硬件安全性。文章还提供了JTAG接口安全管理和NKZ文件备份方案,帮助开发者避免常见陷阱,确保安全编程的可靠性。

weixin_42535703的博客 431

深入解析MOSFET结电容与分布参数:Cgd、Cgs、Cds与Ciss、Crss、Coss的关系与应用

本文深入解析了MOSFET结电容Cgd、Cgs、Cds及其等效参数Ciss、Crss、Coss对开关性能的影响。文章详细阐述了米勒电容Cgd如何导致开关损耗与振荡,并提供了基于电容参数的高频电路选型、驱动设计及PCB布局优化等实战指南,帮助工程师解决开关电源与电机驱动中的常见问题。

weixin_29240711的博客 1308

如何检测和隔离内存泄漏

用Microsoft Visual C++来检测和隔离内存泄漏 简介具有动态的分配和释放内存的能力是C/C++程序语言的重要特色之一,但是中国的哲人孙子指出,最强有力的也是最脆弱的。对C/C++应用程序来说这当然是正确的,内存管理错误通常是bug起源之一。非常微妙且难于检测的bug之一就是内存 泄漏——不能正确地去分配已经分配了的内存。一个仅仅发生一次的轻微内存泄漏不可能引起注意,但是泄漏了大量内

zhangjie0072的专栏 1002

《哥谭神话-工程篇》01.Palantir 平台架构解析-混乱数据如何转化唯一真相源?

Palantir 平台的架构哲学可以概括为将洞察落地为行动,其核心是将“获取唯一真相”能力深度嵌入现有的、复杂的工作流程中,成为提升运营效率和决策质量的倍增器。

905

用V C++检测和隔离内存泄漏(引用)

用V C++检测和隔离内存泄漏英雄 C、C++ (2003-11-03 09:12:56) --------------------------------------------------------------------------------  具有动态的分配和释放内存的能力是C/C++程序语言的重要特色之一。Visual C++ debugger 和 CRT库提供了一系

Scorpio Auding @ Blog++ 1155

[CTFSHOW]JWT

文章目录前言JWT简介CTFSHOW Web345CTFSHOW Web346前置知识开始做题CTFSHOW Web347CTFSHOW Web348CTFSHOW Web349CTFSHOW Web350前置知识利用WP如何防御 前言 有些师傅向我咨询WP,索性就发了吧,其实早就写好了,只是懒,在github仓库里囤着 JWT简介 可以看看我的Github总结给自己看的,Y4tacker CTFSHOW Web345 首先打开题目,查看源码,接下来访问/admin被跳转回主页啥也没有发生 where is

Y4tacker的博客 6045

msfvenom制作windows/linux/android/ios木马

msfvenom选项如下 -p, --payload<payload> 指定 payload(攻击荷载)。如果使用自定义payload,请使用'-'或者stdin指定。 -l, --list [module_typel列出指定模块的所有可用资源。模块类型包括:payloads, encoders, nops, all -n, --nopsled <length>为payload预先指定一个NOP滑动长度。 -f, --format <format>指定输出格式(使

Cwillchris的博客 2735

什么是内存泄漏?C++中如何检测和解决?

内存泄漏是指程序在运行过程中,由于疏忽或错误导致已分配的内存空间无法被正确释放,使得这部分内存一直被占用而无法被操作系统回收再利用的现象。在 C++ 等编程语言中,如果使用new或malloc等动态内存分配操作,但忘记使用delete或free来释放内存,就可能会导致内存泄漏。充分理解内存泄露和解决问题的方法,不仅在编码过程中避免问题,也能在面试中搞定面试官,最后预祝兄弟们在新的一年里,涨薪多多,工作更上一层楼,关注威哥爱编程,做一名纯粹的程序员。

威哥爱编程,华为 HDE,鸿蒙极客、优快云博客专家、《鸿蒙 HarmonyOS 5/6 开发之路》系列图书第一作者 1211

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++ 内存泄漏检测工具——Valgrind(Linux系统)

前六种是比较常见的问题,内存泄漏主要是有(4)(5)引起的,由于程序中申请了空间,但是没有在程序结束或是在函数结束时正确的释放,导致这段空间被无法在后面的程序中继续使用。对于数据量较大的程序,这是很危险的,由于内存占用问题,尽管函数或程序可能执行完毕,但是未被释放,但是内存仍被占用,这些空间无法后续使用或被其他程序使用,可能会导致计算机运行变慢,也可能导致后续程序无法正常运行。–log-file=< file > 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID。

可爱满分的博客 2944

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C/C++ 内存泄漏检测工具汇总

文章目录前言crtdbg使用原理例子Visual Leak Detector(VLD)Checkpoint/DumpStatisticsWindbg腾讯WeTest - TMMIBM purifyVVMapApplication VerifierCppcheck 前言 本文主要记录 Windows 下内存泄漏检测工具;Linux 下首选必须是 Valgrind 啊。 目前待检测的程序采用的是 Qt,由于Qt本身的半自动内存管理机制,因此好用的检测工具真的不容易找…详细可看该篇 Qt浅谈之一:内存泄露(总结)

Hsy的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++代码内存泄漏检测

做后台通信服务程序,遇到了内存泄漏问题,上网找解决方案,目前有用的方法总结如下: 1 VLD 以下转自:http://ztbls888.blog.163.com/blog/static/171817598201191111034723/ 初识Visual Leak Detector        灵活自由是C/C++语言的一大特色,而这也为C/C++程 序员出了一个难题

HAN Kai 2186

C++ 内存泄漏检测方法

今天分享一下内存泄漏在不同平台的检测方法。

weixin_42404091的博客 840

QT/C++调试技巧:内存泄漏检测

内存泄漏:指的是在程序里动态申请的内存在使用完后,没有进行释放,导致这部分内存没有被系统回收,久而久之,可能导致程序内存不断增大,系统内存不足……引发一系列灾难性后果。

Rainbow 5540

valgrind内存泄漏检测

g++编译时加入-g(注意在编译程序的时候加上-g选项,打印错误信息的时候会给出行号。): 编译之前先修改Makefile: all : debug 如果还是release的话,报错会显示不出行 然后编译: g++ -g main.cpp -o test 产生可执行文件 一、内存泄漏检测: 不保存日志: valgrind --leak-check=full --show-reachabl...

启迪,昂扬,卓越,追逐,进取 4870

C++开发:内存泄漏分析介绍

内存泄漏指的是程序中动态分配的内存不再被使用,但没有被释放回系统或内存池的现象。随着时间推移,内存泄漏会导致可用内存减少,最终可能导致系统性能下降或者程序崩溃。在C++开发中,尤其是在大型项目中,内存泄漏是一个常见的问题。在 Visual Studio 2017(VS2017) 中开发 C++ 程序时,可以使用多种工具和方法来检测和分析内存泄漏。

倔强老吕的博客 2187
上一篇: 关键字 对齐 内存对齐
下一篇: Direct3D中的HLSL(上)
Image_Graphics
博客等级 码龄20年 18粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值