转:mem

CH341芯片全解析:从USB转串口到I2C/SPI调试的实战指南 在嵌入式开发和硬件调试领域,串行通信总线是连接微控制器与外围设备的基础。UART、I2C和SPI作为最常用的板级通信协议,其调试往往依赖专用的硬件工具。USB总线因其通用性,成为连接计算机与这些低速串行总线的理想桥梁,其核心原理是通过协议转换芯片实现USB数据包与串行信号间的翻译。这种转换技术极大降低了开发门槛,使开发者无需深入底层驱动即可操控硬件。CH341芯片正是这一技术的典型代表,它集成了USB转UART、I2C、SPI及并口的多功能接口转换能力。在应用场景上,它不仅是简单的USB转TTL模块,更能作 阅读详情

最后一种内存问题是 Stack corruption 和 Stackoverrun。stack overrun 很简单,一般是由于递
归函数缺少结束条件导致,使得函数调用过深把 stack 地址用光,比如下面的代码:
Void foo()
{
Foo();
}

只要在调试器里重现问题,调试器立刻就会收到 Stack overflow Exception。检查 callstack 就
可以立刻看出问题所在:
0:001> g
(cd0.4b0): Stack overflow - code c00000fd (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=cccccccc ebx=7ffdd000 ecx=00000000 edx=10312d18 esi=0012fe9c edi=00033130
 
eip=004116f9 esp=00032f9c ebp=0003305c iopl=0
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000
 
nv up ei pl nz na po nc
efl=00010206
 
*** WARNING: Unable to verify checksum for c:\Documents and Settings\Li Xiong\My
Documents\My code\MyTest\debug\MyTest.exe
MyTest!foo+0x9:
 
004116f9 53
 
push
 
ebx
 
0:000> k
ChildEBP RetAddr
0003305c 00411713 MyTest!foo+0x9
00033130 00411713 MyTest!foo+0x23
00033204 00411713 MyTest!foo+0x23
000332d8 00411713 MyTest!foo+0x23
000333ac 00411713 MyTest!foo+0x23
00033480 00411713 MyTest!foo+0x23
00033554 00411713 MyTest!foo+0x23
00033628 00411713 MyTest!foo+0x23
000336fc 00411713 MyTest!foo+0x23
000337d0 00411713 MyTest!foo+0x23
000338a4 00411713 MyTest!foo+0x23

00033978 00411713 MyTest!foo+0x23
00033a4c 00411713 MyTest!foo+0x23


第二种情况 stack corruption 往往是臭名昭著的 stack buffer overflow 导致的。这样的 bug 不
单单会造成程序崩溃,还会严重威胁到系统安全性:


http://search.msn.com/results.aspx?q=stack+buffer+overflow+attack&FORM=MSNH&srch_type
=0

在当前的计算机架构上, stack 是保存运行信息的地方。当 stack 损坏后,关于当前执行情况
的所有信息都丢失了。所以调试器在这种情况下没有用武之地。比如下面的代码:


void killstack()
{
char c;
char *p=&c;
for(int i=10;i<=100;i++)
*(p+i)=0;
}


int main(int, char*)
{
killstack();
return 0;
}


在 VS2005 中用下面的参数,在 debug 模式下编译:


/Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc
/RTC1 /MDd /Gy /Fo"Debug\\" /Fd"Debug\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP
/errorReport:prompt

在调试器中运行,看到的结果是:


0:000> g
 
ModLoad: 76290000 762ad000
ModLoad: 62d80000 62d89000
ModLoad: 75490000 754f1000
 
C:\WINDOWS\system32\IMM32.DLL
C:\WINDOWS\system32\LPK.DLL
C:\WINDOWS\system32\USP10.dll
 
(1d0.1504): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=0012ff5b ebx=7ffda000 ecx=fffffffb edx=0012ffbf esi=00000000 edi=00000000
 
eip=000000f8 esp=0012ff68 ebp=0012ff68 iopl=0
cs=001b  ss=0023  ds=0023 es=0023  fs=003b gs=0000

 

 
nv up ei pl zr na po nc
efl=00010246

000000f8 ??
 

???
 
0:000> kb
ChildEBP RetAddr Args to Child
WARNING: Frame IP not in any known module. Following frames may be wrong.
0012ff64 00000000 00000000 00000000 00000000 0xf8
0:000> dds esp
0012ff68  00000000
0012ff6c  00000000
0012ff70  00000000
0012ff74  00000000
0012ff78  00000000
0012ff7c 00000000
0012ff80  00000000
0012ff84 00000000
0012ff88  00000000
0012ff8c 00000000
0012ff90 00000000
0012ff94  00000000
0012ff98  00000000
0012ff9c 00000000
0012ffa0 00000000
0012ffa4 00000000
0012ffa8  00000000
0012ffac 00000000
0012ffb0  00000000
0012ffb4 00000000
0012ffb8 00000000
0012ffbc  00000000
0012ffc0 0012fff0
0012ffc4 77e523cd kernel32!BaseProcessStart+0x23


Windbg 里面看到 EIP 非法,EBP 指向的地址全是 0,callstack 的信息已经被冲毁。找不到任
何线索。


对于 stack corruption,普遍的做法是首先对问题做大致定位,然后检查相关函数,在可疑函
数中添加代码写 log 文件。当问题发生后从 log 文件中分析线索。在第三部分,有关于如何
检查内存访问错误,stack overflow 和内存泄漏的详细说明

题外话和相关讨论:


关于下面这段代码在激活 pageheap 后不会崩溃的解决方法是使用/unaligned 参数。详细情况
请参考 KB816542 中关于/unaligned 的介绍
char *p=(char*)malloc(1023);
p[1023]=1;


同理,下面这段代码默认情况下使用 pageheap 也不会崩溃:


char *p=new char[1023];
p[-1]='c';


解决方法是使用 pageheap 的/backwards 参数。
上面两个例子说明由于 4kb 的粒度限制,哪怕使用 pageheap,也需要根据 pageheap 的原理
来调整参数,以便覆盖多种情况。


Pageheap 的另外一个作用是 trace。激活 pageheap 的 trace 功能后,Heap Manager 会在内存
中开辟一块专门的空间来记录每次 heap 的操作,把操作 heap 的 callstack 记录下来。当问题
发生后,以便通过导致问题的 heap 地址找到对应的 callstack。参考下面一个例子:

char * getmem()
{
return new char[100];
}


void free1(char *p)
{
delete p;
}


void free2(char *p)
{
delete [] p;
}


int main(int, char*)
{
char *c=getmem();
free1(c);
free2(c);
return 0;
}


该程序在 release 模式,不激活 pageheap 的情况下是不会崩溃的。当激活 pageheap 后,pageheap
默认设定会记录 trace。激活 pageheap 后,在 debugger 中运行会看到:

 

0:000> g

===========================================================
VERIFIER STOP 00000007: pid 0x1324: block already freed


015B1000 : Heap handle
003F5858 : Heap block
00000064 : Block size
00000000 :
===========================================================


(1324.538): Break instruction exception - code 80000003 (first chance)
eax=00000000 ebx=015b1001 ecx=7c81b863 edx=0012fa7f esi=00000064 edi=00000000
 
eip=7c822583 esp=0012fbe8 ebp=0012fbf4 iopl=0
cs=001b  ss=0023  ds=0023  es=0023  fs=003b gs=0000
ntdll!DbgBreakPoint:
 
nv up ei pl nz na pe nc
efl=00000202
 
7c822583 cc
 
int
 
3
 


pageheap 激发一个 break point exception,使 debugger 停下来,同时 pageheap 会在 debugger
中打印出 block already freed 信息,表示这是一个 double free 问题

使用 kb 命令打印出 callstack:


0:000> kb
ChildEBP RetAddr  Args to Child
0012fbe4 7c85079b 015b1000 0012fc94 0012fc70 ntdll!DbgBreakPoint
0012fbf4 7c87204b 00000007 7c8722f8 015b1000 ntdll!RtlpPageHeapStop+0x72
0012fc70 7c873305 015b1000 00000004 003f5858
ntdll!RtlpDphReportCorruptedBlock+0x11e
0012fca0 7c8734c3 015b1000 003f0000 01001002 ntdll!RtlpDphNormalHeapFree+0x32
0012fcf8 7c8766b9 015b0000 01001002 003f5858
ntdll!RtlpDebugPageHeapFree+0x146
0012fd60 7c860386 015b0000 01001002 003f5858 ntdll!RtlDebugFreeHeap+0x1ed
0012fe38 7c81d77d 015b0000 01001002 003f5858 ntdll!RtlFreeHeapSlowly+0x37
0012ff1c 78134c3b 015b0000 01001002 003f5858 ntdll!RtlFreeHeap+0x11a
0012ff68 00401016 003f5858 003f5858 00000064 MSVCR80!free+0xcd
0012ff7c 00401198 00000001 003f57e8 003f3628 win32!main+0x16
[d:\xiongli\today\win32\win32\win32.cpp @ 77]
0012ffc0 77e523cd 00000000 00000000 7ffde000 win32!__tmainCRTStartup+0x10f
0012fff0 00000000 004012e1 00000000 78746341 kernel32!BaseProcessStart+0x23


崩溃发生在 free 函数。Free 函数的返回地址是 00401016,所以 Free 是在 00401016 的前一
行被调用的。发生问题的 heap 地址是 0x3f5858,使用!heap 命令加上-p –a 参数打印出保存
下来的 callstack:


0:000> !heap -p -a 0x3f5858


address 003f5858 found in
_HEAP @ 3f0000
in HEAP_ENTRY: Size : Prev Flags - UserPtr UserSize - state
3f5830: 0014 : N/A  [N/A] - 3f5858 (70) - (free DelayedFree)
Trace: 004f
7c860386 ntdll!RtlFreeHeapSlowly+0x00000037
7c81d77d ntdll!RtlFreeHeap+0x0000011a
78134c3b MSVCR80!free+0x000000cd
401010 win32!main+0x00000010
77e523cd kernel32!BaseProcessStart+0x00000023


从保存的 callstack 看到, 0x401010 前一行上,已经调用过一次 free 了,00401016,00401010
距离很近,看看分别是什么:


0:000> uf 00401010
win32!main [d:\xiongli\today\win32\win32\win32.cpp @ 74]:
 
74 00401000 56
75 00401001 6a64
75 00401003 e824000000
75 00401008 8bf0
76 0040100a 56
76 0040100b e828000000
77 00401010 56
77 00401011 e81c000000
77 00401016 83c40c
78 00401019 33c0
78 0040101b 5e
79 0040101c c3
 
push
push


mov
push


push


add
xor
pop
ret
 
esi
0x64
win32!operator new[] (0040102c)
esi,eax
esi
win32!operator delete (00401038)
esi
win32!operator delete[] (00401032)
esp,0xc
eax,eax
esi
 


这里可以看到,对应的 double free 是连续调用了 delete 和 delete []。对应的源代码地址大约
在 win32.cpp 的 74 行。(源代码中,delete 和 delete[]是在两个自定义函数中被调用的。这里
看不到 free1 和 free2 两个函数的原因在于 release 模式下编译器做了 inline 优化。)

如果有兴趣,可以检查一下 heap pointer 0x3f5858 前后的内容:


0:000> dd 0x3f5848
003f5848  7c88c580 0025a5f0 00412920 dcbaaaa9
 
003f5858
 
f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
 
003f5868 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
003f5878  f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
003f5888  f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
003f5898 f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
003f58a8  f0f0f0f0 f0f0f0f0 f0f0f0f0 f0f0f0f0
003f58b8  f0f0f0f0 a0a0a0a0 a0a0a0a0 00000000

这里的红色 dcba 其实是一个标志位,标致位前面的地址上保存的就是对应的 callstack:


0:000> dds 00412920
 
00412920
 
00000000
 
00412924 00000001
00412928  0005004f
0041292c  7c860386 ntdll!RtlFreeHeapSlowly+0x37
00412930  7c81d77d ntdll!RtlFreeHeap+0x11a
00412934  78134c3b MSVCR80!free+0xcd
 
00412938
 
00401010 win32!main+0x10
 
0041293c 77e523cd kernel32!BaseProcessStart+0x23


了解这个标致位的好处是,可以利用这个特点来解决 memory leak 和 fragmentation。发生泄
漏的内存往往是相同 callstack 分配的。当泄露到一个比较严重的程度的时候,程序中残留的
大多数的 heap pointer 都是泄露的内存地址。由于每一个 heap pointer 都带有标志位,通过在
程序中搜索这个标志位,就可以找到分别的 callstack。如果某些 callstack 出现得非常频繁,
往往这些 callstack 就跟 memory leak 相关。下面就是一个使用这个方法解决 memory leak 的

std::mem_fun vs std::mem_fn, std::bind1st/std::bind2nd vs std::bind 1.mem_fun vs mem_fn 在C++ 11之前,当需要使用STL算法对容器中的对象一次调用成员函数时,我们需要使用到mem_fun或者mem_fun_ref,至于mem_fun和mem_fun_ref之间的选择根据容器中存储的对象是对象指针还是对象本身来选择,其中mem_fun针对对象本身,而mem_fun_ref则针对对象本身。例如, class T { pu 阅读详情

相关推荐

uvm_mem 模型 (1)

class my_mem extends uvm_mem; function new (strng name); super.new(name,1024,32,"RW"); endfunction endclass class my_blk extends uvm_reg_block; my_mem mem_clent; uvm_reg_map my_map; function build(); mem_clent=my_mem::typ

liuwei848的博客 3020

理解First Chance和Second Chance避免单步调试

在现在C++、Java、.Net代码大行其道的时候,很多代码错误(Bug)都是通过异常的形式表现出来的。由于工期紧或者种种原因,很多程序员在碰到程序发生未处理的异常的第一反应就是try … catch (Exception e) { … }。然而代码开发到后期的时候,这种简单粗暴的解决代码错误(Bug)的方式就会在其他不相干的地方表现出来,有的时候甚至导致程序随机的不稳定,而且很难调试。比如执行下

qsycn的专栏 1676

[AI Mem0] 源码解读,带你了解 Mem0 的实现

核心就是 Memory 类,实现了 MemoryBase 接口通过 embedding_model 来处理文本通过 vector_store 存储 embedding通过 llm 处理数据通过 db 记录 Memory 的历史githubdocAI 博客 - 从零开始学AI公众号 - 从零开始学AI。

从零开始学AI的博客 1528

深入浅出 First chance, second chance和ExceptionPort

<br />ExceptionPort的作用,是在用户态异常的第2轮分发过程中,如果第二轮还无人处理,那么就会发到ExceptionPort 。关于异常的分发,部分可以参考 理解UnhandledExceptionFilter <br />对于ExceptionPort,每个普通进程都会设置,CSRSS进程负责监听。CSRSS收到异常消息后一般是立刻终止进程,Win7开始,略有变化。<br />可以使用windbg做个实验,加深对上述概念的理解。来段简单的代码,<br />int main(int argc

Viper的专栏 1805

大模型的记忆Mem0

Mem0是一个面向生产环境的AI记忆系统,旨在解决大型语言模型在长期记忆和多轮对话中的局限性。它通过提取关键信息、混合存储结构(向量、键值、图数据库)和智能检索机制,将记忆功能从prompt中解耦,从而降低token成本和提高响应效率。Mem0支持托管平台和开源自托管两种模式,提供Python和JavaScript SDK,并已集成到AutoGen等框架中。实验表明,Mem0在准确率和效率上优于传统记忆方案,适用于需要长期记忆的AI助手和Agent应用。

言之。 1万+

Dify长期记忆插件: Mem0 与 Memobase

前言:如何在Dify上面快速实现长期记忆(不了解长期记忆的可以查看文章)。技术选型在开发实现中占据重要地位,Dify目前提供了众多插件,我们来对比热门的 mem0 和 memobase。在技术架构、应用场景和功能特性上存在显著差异。需要快速集成动态记忆、实时性要求高(如聊天机器人)、开发资源有限的中小型项目。,通过实时更新和衰减机制保持记忆的新鲜度;需长期用户画像分析、高并发处理(如教育平台)、隐私敏感的企业级应用。作为 Dify 平台中两种主流的记忆组件,,通过结构化存储实现长期记忆的精准调用。

Mamba的博客 3684

异常处理之不要放过First-chance exception

不要放过First-chance exception1)什么是First-chance exception VC6调试环境下(debug)运行程序时,经常在output窗口看到有 First-chance exception in hotfoxd.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception. 的输出字样。 当调试程序时,若引发

铭星的专栏 2万+

Claude-Mem:编程时的持久记忆压缩系统

**摘要:**Claude-Mem是一款智能编程插件,通过AI压缩和持久化编码会话记忆,帮助开发者跨会话保持上下文。主要功能包括自动记录操作、自然语言搜索历史、隐私控制配置及实验性无尽模式。支持通过命令快速安装,自动注入历史会话信息,并提供细粒度配置选项。其架构采用SQLite存储和自然语言处理技术,显著提升开发效率,相比同类工具更注重自动化与智能学习能力。(149字)

weixin_44626085的博客 1417

stack corruption detected问题探究

问题现象 复现步骤 Android 7.0平台 安装手机百度apk(v8.6.5) 启动App后必现native crash 分析定位 初步分析 tombstone文件如下 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Native Crash TIME: 959207 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** Revision: '0' A

sunshineywz的博客 5921

南开大学编译原理课设实践包:LLVM IR级优化实现(mem2Reg/控制流简化/常量传播)

这个实践包是南开大学编译原理课程配套的完整LLVM风格中间表示优化实现,聚焦真实编译器后端优化环节。包含mem2Reg寄存器分配预处理,用于将内存访问转为寄存器操作;SimplifyCFG控制流图简化,自动合并冗余块、消除不可达分支;ElimPHI节点消除,配合控制流优化清理Phi指令;以及基于数据流分析的常量传播,支持跨基本块常量折叠与替换。所有模块用C++编写,结构清晰:Ast负责语法树构建,BasicBlock和Function管理控制流结构,Instruction和Operand封装指令语义,Sym

theta的博客 186

AIGC内容溯源技术:如何追踪AI生成内容的原始来源

本文旨在系统性地介绍AIGC内容溯源的技术体系,帮助读者理解如何追踪AI生成内容的来源。我们将覆盖从基础概念到前沿技术的完整知识链,包括但不限于数字水印、区块链存证、内容指纹等技术方案。文章将从AIGC的基本概念出发,逐步深入探讨各种溯源技术,分析其原理和实现,最后讨论实际应用和未来趋势。AIGC:AI Generated Content,人工智能生成内容内容溯源:追踪数字内容的创作、修改和传播历史数字水印:嵌入在数字内容中的不可见识别信息数字水印:隐藏在内容中的识别信息,像隐形墨水内容指纹。

SuperAGI2025 2070

boost::mem_fn和std::mem_fun在MSVC6.0上的表现 (转)

boost::mem_fn和std::mem_fun在MSVC6.0上的表现 (转)[@more@] ...

csd3176的博客 111

从IMU数据到精准定位:手把手推导ESKF中的四元数运动学与误差状态方程

本文详细介绍了如何从IMU数据推导ESKF中的四元数运动学与误差状态方程,实现精准定位。通过分析误差状态卡尔曼滤波器的优势、四元数表示的必要性,以及IMU测量模型和运动学基础,提供了完整的数学推导和实现要点。适合机器人定位和自动驾驶领域的算法工程师参考,帮助优化导航系统性能。

weixin_30271335的博客 680

C++11的std::mem_fn源码解析

C++11的std::mem_fn源码解析1、源码准备2、通过一个简单的例子来了解std::mem_fn的作用3、std::mem_fn源码解析3.1、std::mem_fn解析3.2、std::_Mem_fn解析3.3、在代码中正确使用std::_Mem_fn4、总结 1、源码准备 本文是基于gcc-4.9.0的源代码进行分析,std::mem_fn是C++11才加入标准的,所以低版本的gcc源码是没有std::mem_fn的,建议选择4.9.0或更新的版本去学习,不同版本的gcc源码差异应该不小,但是

游戏行业资深搬砖人员 1万+

Android布局基础与UI设计入门:打造精美应用界面

恭喜你!现在你已经掌握了Android UI开发的基础知识,包括各种布局类型、常用控件的使用以及一些UI优化技巧。这些知识将帮助你设计出既美观又实用的Android应用界面。

m0_65382359的博客 2056

【C语言】字符常量详解

字符常量是C语言中处理字符数据的重要工具。通过单引号括起一个字符,我们可以方便地使用字符常量进行字符判断、字符运算和字符串处理等操作。理解字符常量的表示方法、使用场景和ASCII码对应关系,对于编写高效的C语言程序至关重要。

LuckiBit 5017

mem2mem解析

我们都知道,V4L2是一种标准的多媒体驱动框架,但它只是起到了承接上层调用到设备驱动代码的作用,但是每个多媒体驱动的内存管理是独立的,比如fimc,jpeg,mfc等的内存都是自己独立申请,释放。 随着多媒体驱动的共性越来越多,为了抽象代码,便于开发和维护,内核现在在多媒体视音频驱动目录drivers/medis/video/下已经逐渐统一了规范。主要分为几大块,可以归纳为v4l2,subdev

JerryMo06的专栏 9242

Mybatis面试题(基础篇)

(1)mybatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。(2)mybatis避免了几乎所有的JDBC代码(说明了mybatis底层用的就是JDBC,只不过是封装了)和手动设置参数以及获取结果集。(3)mybatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的pojo映射成数据库中的记录。

qq_38196449的博客 1687

STL中mem_fun和mem_fun_ref的用法

    怎么对容器中的所有对象都进行同一个操作?我们可能首先想到的是用循环来实现。    比如有如下的一个类:class ClxECS{public:    int DoSomething()     {         // 这里以输出一句话来代替具体的操作        cout  "Output from method DoSomething!"  endl;         ret

寒星轩 2万+

【面试系列】数据工程师高频面试题及详细解答

本文针对数据工程师岗位,提供了详尽的面试题库和解答,分为初级、中级和高级三个层次。初级面试题主要涉及基本的数据处理和ETL工具的使用,如SQL查询、数据清洗和基本的数据建模。中级面试题重点考察数据管道设计、数据库优化和大数据平台的应用。高级面试题则深入探讨高级数据处理技术、分布式系统架构和数据湖的实现。通过这些问题和解答,候选人可以全面了解数据工程师岗位所需的技能,帮助其更好地准备面试。常考知识点总结部分则系统归纳了数据工程师岗位的关键技能领域。

在路上的专栏 2375

【水文学法总结】河道内生态流量计算方法(含MATLAB实现代码)

简介水文学法实现河道内生态流量计算

WW、forever的博客 5017

stl 函数适配器之std::mem_fun(c++98),sd::mem_fun_ref(C++98), std::men_fn(C++11)的用法

目录环境std::mem_fun(deprecated in C++11)std::mem_fun_ref(deprecated in C++11)缺点结语 环境 Qt 5.12.4 MinGW 64-bit std::mem_fun(deprecated in C++11) 定义 指针版本:通过指向对象的指针调用成员函数时使用 //针对无参数(this除外)的非const成员函数,返回值可...

qqq1111e的博客 2386

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

如何使用std::mem_fn (since C++11)

转自https://blog.csdn.net/elloop/article/details/50375820 前言 本文总结了STL中函数适配器:mem_fn系列函数的用法,它们是:mem_fun (c++98), mem_fun_ref (c++98), mem_fn (c++11). 文中给出了它们各自的使用范围及代码示例,提到了mem_fn的使用限制,使用bind来解决这个限制。 基本...

janeqi1987的专栏 1644

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

我的北航MEM之路 & MEM备考经验分享

今天终于收到自己梦寐以求的北航的录取通知书,今年的通知书长这样~👇:回想这段路程,一共考了两次(第一次182,北航MEM分数线175;第二次201,北航MEM分数线190,第一次考笔试过了,复试没好好准备挂了,有点小遗憾,但梦想还在,于是再来一年,多么痛的领悟,可千万别信某些培训班的话,复试不刷人,这几年形势一直变,没人知道政策具体会怎么改,不管哪个环节都要认真对待)...

wangdsh的博客 3137

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 使用vc发现的一些问题记录
下一篇: crgn相关
tompaz
博客等级 码龄24年 34粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值