C++
jiangfuqiang
这个作者很懒,什么都没留下…
展开
-
windows7下用svn出现的"cann't move file"的问题
问题:今天要搭一个svn库,需要把boost中的include和lib文件放到svn server上。但是在执行svn add的时候,总是出现"cannt move file xx to xx"的错误,而且错误文件的路径是随机的。原因及解决:由于本机设置了windows7中的indexing服务会对D:/盘进行索引,而svn add又是在D:/执行的,因此在move file的时候,原创 2009-10-31 16:58:00 · 1021 阅读 · 0 评论 -
Linux中kfifo数据结构的精妙之处:即使溢出仍然正确
kfifo是linux内核中的环形缓冲区,实现了先进先出的队列数据结构。以下为kfifo的数据结构定义(内核版本2.6.33.20):struct kfifo { unsigned char *buffer; // 环形缓冲区的大小 unsigned int size; // 环形缓冲区的大小,必须是2的冥 unsigned in原创 2013-11-27 09:28:41 · 4153 阅读 · 2 评论 -
用实例证明dll中new的内存不能在exe中释放
VC中新建一个dll工程,设置使用“多线程调试DLL (/MDd)”。该dll导出以下alloc函数:__declspec( dllexport )int* alloc(){ printf("in dll: %p\n", malloc); return new int[100];}VC中新建一个exe工程,设置使用“多线程调试(/MTd)”,并且引用刚才的原创 2013-10-30 22:24:59 · 1410 阅读 · 2 评论 -
Windows下三种唤醒线程的方法
多线程编程经常遇到以下问题:主线程退出前,后台线程也优雅的退出。如果后台线程处于阻塞状态,则需要把阻塞线程激活。本文讨论Windows下面,三种激活阻塞线程的方法。第一种:利用WaitForMultipleObjects函数让线程处于阻塞状态,并设置多个等待对象中的任一对象处于signal状态下都返回。此时向WaitForMultipleObjects传递的等待对象数组要包含一个额外的原创 2020-03-31 11:23:37 · 6340 阅读 · 0 评论 -
因不懂IOCP被鄙视,此处留下记号
内容待完善原创 2013-10-21 21:34:14 · 1259 阅读 · 0 评论 -
通过反汇编分析C语言中volatile关键字的含义
根据C语言标准,volatile关键字的作用是禁止编译器对相关变量的存取进行优化。本文利用VC 2010和GCC 4.4.7,分析volatile关键字对生成的汇编代码的影响,以验证volatile的具体含义。VC 2010以下是基础C代码int gMark = 1;int _tmain(int argc, _TCHAR* argv[]) { while(gM原创 2013-10-26 21:17:56 · 2225 阅读 · 0 评论 -
Windows下QtCreator编译过程
QtCreator是QT自带的开发工具,是学习QT非常好的参考资源.本文提供对编译QtCreator的简单描述(理论上官网发布的都是可以编译的,但实际编译时候会遇到一些问题,本文记录下解决方法)编译环境:Windows 7 X64 + Visual Studio 2010 + qt5.0.2编译过程:1.解压缩qt-creator-2.7.0-src(源码从原创 2013-05-29 23:14:11 · 7197 阅读 · 0 评论 -
C++Test静态分析时,抛出”解析文件失败”错误的原因及解决方法
C++Test可以执行代码静态分析,检验代码是否符合MisraC++等规则。本文讨论了C++Test进行静态分析时候,抛出解析文件失败错误的原因,并提出绕过去的方法。本文内容基于以下软件环境Windows 7 / Visual Studio 2010 / C++Test9.0VS插件版时间仓促,本文文字没有认真组织,以说明清楚问题为主,希望对遇到同样问题的同行提供一些思路。C++Tes原创 2013-04-07 21:07:37 · 8163 阅读 · 6 评论 -
VC中捕捉StackOverflow异常
程序中栈溢出通常会导致进程直接关闭。本文分析Windows中栈增长和溢出过程,并提供一种捕捉栈溢出的方法,作为调试程序的参考。栈大小 VC中,栈大小默认为1M,但可以在编译的时候或在创建线程的时候指定其他值。栈增长和溢出 栈底地址在线程生命期内是常量,栈顶地址保存在SP(ESP、RSP)寄存器。栈地址从高向低增长,因此栈增长,对应着SP寄存器减小。 1M空间只原创 2012-12-24 18:34:52 · 4183 阅读 · 1 评论 -
shared_ptr线程安全性分析
shared_ptr线程安全性分析正如《STL源码剖析》所讲,“源码之前,了无秘密”。本文基于shared_ptr的源代码,提取了shared_ptr的类图和对象图,然后分析了shared_ptr如何保证文档所宣称的线程安全性。本文的分析基于boost 1.52版本,编译器是VC 2010。shared_ptr的线程安全性boost官方文档对shared_ptr线程安全性的正式表述是:原创 2012-12-13 22:34:40 · 28394 阅读 · 6 评论 -
VC的Buffer Security Check
C/C++对内存的访问非常自由,也会带来一些问题。比如对一个局部数组变量的越界写入就可能导致栈数据被意外修改。 为了防止线程栈被有意无意错误改写,VC编译器提供了/GS开关,指示编译器在栈的某些变量的前后留出空白内存区。编译器在原函数体代码前面插入代码,向空白内存区中写入某个数值(security cookie),并在原函数体代码后面插入代码检查空白内存区中的数值是否保持不变。如原创 2012-12-24 18:59:36 · 2484 阅读 · 0 评论 -
VS 2010 std::list.sort函数实现的非递归merge sort
td::list.sort()采用的是mergesort算法。merge sort的递归实现非常简单,一般为MergeSort(1,n){ MergeSort(1,n/2); MergeSort(n/2,n); Merge(1,n/2,n);}下图为用一个长度为16的序列调用MergeSort形成的归并树(节原创 2012-12-11 17:26:08 · 2438 阅读 · 0 评论 -
DEBUG下,VS 2010的vector和相关迭代器的安全检查和记录功能
本文分析DEBUG配置下,VS 2010中std::vector和相关迭代器提供的安全检查和记录功能。有的功能非常耗时。幸好在RELEASE配置下,这些功能都被预编译指令去掉了。当然这也说明,针对VC程序的效率测试必须采用RELEASE版本,否则测试结果很难说明问题。 std::vector和std::vector迭代器的类图其中,_Vector_iterator是st原创 2012-12-10 19:23:27 · 4847 阅读 · 0 评论 -
VC 2010 非标准STL容器hash map代码分析
综述两个主要的文件:xhash和hash_map,所在的目录是C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include。提供hash_map和hash_multimap两个类。在默认情况下的继承关系和模板实例化情况如下图,其中_Kty是Key类型,_Ty是Value类型,由用户指定,Allocator是STL中的内存分配器原创 2012-12-06 20:59:46 · 2521 阅读 · 0 评论 -
VC中的#和##宏替换指令
宏替换中的#是把宏替换成字符串常量,比如:例1:#define MARK(name) printf(#name);MARK(abc)被替换为 printf("abc");例2:#define MARK(name) printf(L#name);MARK(abc)被替换为 printf(L"abc");宏替换中的##是把自身前后的符号连接起来例:#define原创 2010-01-05 23:14:00 · 1784 阅读 · 0 评论 -
visual C++ 2003中swprintf的问题
最近写了这样一个函数,在VC 2008编译和运行都是正确的inline wchar_t* NewCharArray(const std::wstring& str){ wchar_t* pResult = new wchar_t[str.length() + 1]; swprintf(pResult, str.length() + 1, L"%s", str.c_st原创 2009-11-17 17:12:00 · 1519 阅读 · 0 评论 -
4字节UTF16编码和对C++/Java的影响
(1)UTF16也可以占据4个字节; (2)这一点对C++和Java有何影响原创 2013-12-09 14:10:31 · 4548 阅读 · 1 评论