C++技术总结
文章平均质量分 56
segen_jaa
这个作者很懒,什么都没留下…
展开
-
C++中一个P0级的磁盘清空问题复盘
事件背景 一个小伙伴开开心心写了一段文件夹删除代码,不过在自测的时候出现了事故。 整个C盘文件被一扫而空,不得不重装系统,珍藏资料也难以找回。 问题排查 先上源码。警告:此源码切勿运行 #include <string> std::wstring dirBackSlashAlign(const std::wstring& strDir) { std::wstring strTemp = strDir; if (!strTemp.empty() &&原创 2020-08-14 23:57:51 · 317 阅读 · 0 评论 -
C++中实现不可复制的类
使用场景 在C++中实现不可复制的类,源码剖析的是boost中的noncopyable类。 C++11实现 要实现对象的不可复制,需要在拷贝构造和赋值操作上做文章。 C++11中比较优雅,直接用= delete做函数删除即可。 default关键字指使用编译器默认生成的函数,不再自己实现构造和析构。 具体代码如下。 class noncopyable { public: noncopyable() = default; ~noncopyable()原创 2020-08-13 22:01:17 · 338 阅读 · 0 评论 -
C++技术问题总结-第12篇 设计模式原则
设计模式六大原则,参见http://www.uml.org.cn/sjms/201211023.asp。 1. 单一职责原则 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。 问题由来:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。 解决方案:遵循单一职责原则。分别建原创 2014-10-10 15:09:34 · 1133 阅读 · 0 评论 -
C++技术问题总结-第11篇 网络通信中主机序网络序
网络通信经常涉及到字节序转化,接下来理解主机序和网络序有什么异同。 ①主机字节顺序HBO(Host Byte Order) 采用小头序(little-endian),从低到高的顺序存储。 低位字节排放在内存的低地址端,高位地址排放在高位地址端。 ②网络字节顺序NBO(Network Byte Order) 采用大头序(big-endian),从高到低的顺序存储。 高位字原创 2014-10-10 14:26:56 · 1313 阅读 · 0 评论 -
C++技术问题总结-第15篇 内存泄露有哪些方法定位,崩溃有哪些方法定位
Visual C++内存泄露检测,可采用VLD工具。 VLD:Visual Leak Detector。VLD是一款用于Visual C++的免费的内存泄露检测工具。他的特点有:可以得到内存泄漏点的调用堆栈,如果可以的话,还可以得到其所在文件及行号;可以得到泄露内存的完整数据;可以设置内存泄露报告的级别;并且是开源免费的。 官方网址:http://vld.codep原创 2014-12-15 14:19:13 · 2699 阅读 · 0 评论 -
C++技术问题总结-第14篇 常用设计模式及其应用场景
设计模式是对设计原则的具体化。用江湖话说就是武林秘籍,总结出来的一些固定套路,编程界的《葵花宝典》。 个人意见,编程过程中设计原则进行遵循,对设计模式进行借鉴。完全按照套路来,有时反而简单问题复杂化。 常用的模式及其场景如下。 1) 单例模式。 单例模式是一种常用的软件设计模式。 在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保原创 2014-12-12 17:23:10 · 4218 阅读 · 0 评论 -
C++技术问题总结-第13篇 调用约定有哪些,有什么不同
调用约定(Calling convention),决定以下内容: a. 函数参数的压栈顺序。 b. 由调用者还是被调用者把参数弹出栈。 c. 以及产生函数修饰名的方法。 常用的调用约定为__stdcall、__cdecl、__fastcall。 1) __stdcall。 StandardCall的缩写,约定内容: a. 参数从右向左压入堆栈。 b. 函数被调用者修改堆栈。原创 2014-12-12 11:22:22 · 998 阅读 · 0 评论 -
虚函数相关问题探索
虚函数相关问题探索本篇文章中对虚函数做五个方面的探索。 1) 虚函数单一继承对象模型。 2) 虚表指针与虚表的创建释放时机。 3) 析构函数设置为虚函数。 4) 构造函数调用虚函数。 5) 析构函数调用虚函数。1. 虚函数单一继承对象模型 参见网址:http://www.cnblogs.com/taoxu0903/archive/2008/02/04/1064234.ht原创 2015-06-30 17:19:54 · 830 阅读 · 0 评论 -
智能指针仿真-003-共享智能指针
1. 概述 本篇对共享所有权的智能指针进行仿真。 仿真指针主要有:boost/c++ 11 tr1中的shared_ptr、weak_ptr。 boost与c++ 11 tr1的关系这里稍微做一下类比,shared_ptr在boost中时可以认为是储君(准标准),进入到了tr1之后就正名了就算正式登基了是完全标准的了。2. this指针的探讨 this指针是编译器默认生成到成员函原创 2015-09-20 15:42:45 · 729 阅读 · 0 评论 -
C++技术问题总结-第8篇 STL内存池是怎么实现的
STL内存池机制,使用双层级配置器。第一级采用malloc、free,第二级视情况采用不同策略。这种机制从heap中要空间,可以解决内存碎片问题。 1.内存申请流程图 简要流程图如下。 2.第二级配置器说明 第二级配置器目的解决小型区块造成的内存碎片问题。 使用自由链表(free-list)技巧。主动将任何小额区块的内存需求量上调至8的倍数。如需求30,则原创 2014-09-04 10:15:16 · 2774 阅读 · 0 评论 -
C++技术问题总结-第7篇 map、vector、list、deque各自的使用场合
map是关联式的,vector、list、deque是序列式的。 map:底层机制RB-tree(红黑树),元素自动排序,键值对。 vector:操作方式与array相似,动态空间增长。是连续性空间,支持随机访问。 优点: Ø 内存动态增长,不需要指定内存大小。 Ø 支持随机访问,即支持[]和vector.at()。 缺点: Ø 在内部进行插入原创 2014-08-27 17:23:42 · 1995 阅读 · 0 评论 -
C++技术问题总结-第0篇 类型转换
从今天开始,对C++常用技术做个总结。 参考书籍:《C++Primer》、《C++对象模型》、《设计模式》、《Windows核心编程》、《STL解密》。 1. static_cast等四个cast的具体意义 C++类型转换:隐式转换和显式转换。 显式转换:static_cast、dynamic_cast、reinterpret_cast、const_cast。 1.1原创 2014-07-24 10:03:10 · 1131 阅读 · 0 评论 -
C++技术问题总结-第3篇 线程同步
线程同步的方法 线程同步有多种方法。 用户模式下的线程同步:关键段(critcal section)。 内核模式下的线程同步:事件、计时器、信号量、互斥量。 1.关键段 用户模式下的同步,主要API如下。 InitializeCriticalSection、DeleteCriticalSection、EnterCriticalSection、LeaveCriticalSection原创 2014-08-07 14:42:42 · 1200 阅读 · 0 评论 -
C++技术问题总结-第1篇 内存布局
进程中内存的布局 参见:http://patmusing.blog.163.com/blog/static/135834960201001512358686/ 常量区只读不可写。 静态区可读写。 示例 //所有代码,在Code segment //在Global data segment,const只是个语法标识,不放Constant segment const double原创 2014-07-28 15:41:43 · 902 阅读 · 0 评论 -
C++技术问题总结-第9篇 智能指针
智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,能够在适当的时间自动删除指向的对象外,能够确保正确的销毁动态分配的对象。 标准库的智能指针为auto_ptr。boost库的智能指针族在功能上做了扩展。 1.auto_ptr auto_ptr注意事项如下。 ①auto_ptr不能共享所有权。 ②auto_ptr不能指向数组。 ③auto_ptr不能作为原创 2014-09-05 14:40:42 · 1193 阅读 · 0 评论 -
C++技术问题总结-第6篇 STL迭代器相关
1、STL为什么要用迭代器 iterator模式定义:提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式。 STL的中心思想在于:将数据容器(containers)和算法(algorithms)分开,彼此独立设计,最后再以一贴胶着剂将它们撮合在一起。迭代器便起这个作用。 2、迭代器是怎么实现的 迭代器实现示例。原创 2014-08-25 17:36:49 · 991 阅读 · 0 评论 -
C++技术问题总结-第10篇 MFC中SendMessage与PostMessage异同
应用程序消息有三个来源:硬件消息(鼠标键盘等外设)、PostMessage消息、SendMessage消息,都可以发送消息事件来驱动程序执行。 消息流图如下。 硬件消息响应流程如下。 ①消息进入系统消息队列。 ②消息分发到应用程序消息队列。 ③应用程序循环获取消息。 ④消息处理函数执行。 PostMessage直接进入上述步骤②,将消息放入消息队列中,然后立刻返回。 Sen原创 2014-09-09 16:04:10 · 1882 阅读 · 0 评论 -
C++技术问题总结-第5篇 TCP三次握手
TCP三次握手 TCP提供可靠的连接服务,采用三次握手确认建立一个连接。 TCP标志位有6种。 SYN:synchronous建立联机。 ACK:acknowledgment确认。 PSH:push传送。 FIN:finish结束。 RST:reset重置。 URG:urgent紧急。 三次握手主要依靠的是SYN和ACK标志位。 握手详细流程图如下。 简化步骤原创 2014-08-14 16:25:06 · 2079 阅读 · 0 评论 -
C++技术问题总结-第4篇 TCP与UDP
TCP、UDP各自client、server端描述 TCP、UDP位于传输层,基于IP协议。 1.TCP TCP:Transmission Control Protocal 传输控制协议。 服务器与客户端执行流程如下。 API说明。 创建套接字:SOCKET localSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);原创 2014-08-14 16:23:19 · 1056 阅读 · 0 评论 -
C++技术问题总结-第2篇 进程通信
进程通信的方法 进程通信基本方法有如下几种。 1、消息传递机制。 2、共享内存。 3、管道和邮槽。 4、剪贴板。 5、Socket通信。 1.消息传递机制 使用WM_COPYDATA实现进程间的传递数据。 函数原型 LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam) 参数 hWnd:其窗原创 2014-08-06 14:31:28 · 1292 阅读 · 0 评论