
基础知识
文章平均质量分 86
燕山暮雪
人生在世,唯篮球和代码不可辜负
展开
-
Windows系统内存分析工具的介绍
微软官方提供多种工具来分析Windows系统的内存使用情况,除了系统自带的任务管理器(Task Manager),资源监视器(Resource Manager),性能监视器(Performance Monitor),还有SysInternals工具,SysInternals工具如RAMMap和PoolMon,可以用来分析内存问题。本文简单介绍这些工具的使用方法,如果需要了解深入了解,请参考微软相关链接。任务管理器资源监视器性能监视器RAMMap和Process Explorer。转载 2024-04-20 14:02:20 · 1857 阅读 · 0 评论 -
线程安全函数和可重入函数的区别
线程安全: 线程安全函数:在C语言中局部变量是在栈中分配的,任何未使用静态数据或其他共享资源的函数都是线程安全的。 使用全局变量的函数是非线程安全的。 使用静态数据或其他共享资源的函数,必须通过加锁的方式来使函数实现线程安全。 线程安全的(Thread-Safe): 如果一个函数在同一时刻可以被多个线程安全地调用,就称该函数是线程安全的。...原创 2022-02-14 18:33:37 · 1164 阅读 · 0 评论 -
使用Windbg分析C++虚函数表原理
要想学好C++,就得熟悉C++对象模型。如果能利用好调试工具,比如windbg、GDB等,就能够更快速的掌握C++对象模型原理。本系列文章是通过windbg来深入分析C++对象原理,以便更好的理解C++相关知识点。原创 2021-12-17 10:05:10 · 834 阅读 · 0 评论 -
图说C++对象模型:对象内存布局详解
0.前言文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局、虚表指针、虚基类指针等有深入了解的朋友可以慢慢看。本文的结论都在VS2013上得到验证。不同的编译器在内存布局的细节上可能有所不同。文章如果有解释不清、解释不通或疏漏的地方,恳请指出。1.何为C++对象模型?引用《深度探索C++对象模型》这本书中的话:有两个概念可以解释C++对象模型:语言中直接支持面向对象程序设计的部分。 对于各种支持的底层实现机制。直接支持面向对象程序设计,包括了构造函数、析构函数、原创 2021-11-30 14:29:24 · 696 阅读 · 0 评论 -
使用Windbg分析dump文件定位软件异常的方法!
1、前言Windbg是微软开发的在Windows平台下强大的用户态和内核态调试工具,是Windows系统排查软件异常的一大利器,使用Windbg能极大的提高我们排查问题的效率,Windbg可以快速分析出软件崩溃、死循环、死锁等多种异常。很多时候,如果仅仅通过排查代码或者添加打印去排查软件的异常崩溃,效率会很低,特别是代码量比较大的大项目,查起来会更加费劲。并且有些软件异常不是必现的或很难复现的,更不利于问题的排查。我们可以在工程代码中引入谷歌的CrashReport库,给软件安装异常捕获机制,当原创 2021-09-26 10:33:38 · 8741 阅读 · 0 评论 -
C++ 进程间通信详解
一,C++ 常用进程间通信管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。 命名管道(namedpipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linu.转载 2021-06-22 15:11:13 · 10664 阅读 · 0 评论 -
C/C++ 服务器程序(从入门到精通)
Windows 服务被设计用于需要在后台运行的应用程序以及实现没有用户交互的任务。为了学习这种控制台应用程序的基础知识,C(不是C++)是最佳选择。本文将建立并实现一个简单的服务程序,其功能是查询系统中可用物理内存数量,然后将结果写入一个文本文件。最后,你可以用所学知识编写自己的 Windows 服务。当初我写第一个 NT 服务时,我到 MSDN 上找例子。在那里我找到了一篇 Nigel Thompson 写的文章:“Creating a Simple Win32 Service in C++”,这篇文转载 2021-04-26 11:26:34 · 2551 阅读 · 0 评论 -
VMMap 使用说明以及内存指标详解
任务管理器中关于内存的两个重要概念:private和working set。但是内存远不止那么简单,下面我根据VMMap来详细介绍一下内存的分类。内存是一个很复杂的系统,其中的paging file,sharable memory,reserve和commit等概念使得要算清楚一个进程到底使用了多少内存几乎成了不可能的事情了。还好我们有VMMap这个工具,它用两个纬度将内存进行了详细的划分。一个是纵向的纬度,也就是内存是从哪里来的。分为Image(可执行文件), Mapped file(由原创 2021-03-29 16:39:14 · 3787 阅读 · 0 评论 -
标准模板库绕不过的坎-迭代器失效,常用的处理方法
1. 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。 for (iter = cont.begin(); iter != cont.end();) { (*it)->..原创 2020-10-30 20:12:57 · 276 阅读 · 0 评论 -
字符编码
字符编码我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是6...转载 2018-12-26 17:47:53 · 138 阅读 · 0 评论