
C/C++
文章平均质量分 63
enjolras
这个作者很懒,什么都没留下…
展开
-
对select接口定义的思考
linux发行版是centos6.x 64。select是一种常见的IO复用技术。虽然已经过时了,但还是有一些借鉴意义的。函数原型如下:int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);nfds:最原创 2014-01-05 11:16:17 · 1544 阅读 · 0 评论 -
模板的特化与偏特化
<br />转自:http://apps.hi.baidu.com/share/detail/21329483<br />Partial Template Specialization能够让你在模板(Template)的所有可能的实体中特化出一组子集.<br />1.模板的特化(template specialization):<br /> 例如,定义如下的一个模板:<br /> template<class Window, class Controller><br /> class Wi转载 2011-02-21 20:09:00 · 702 阅读 · 0 评论 -
在使用一个全局底层键盘钩子dll时遇到的问题
钩子的dll代码是网上找的,Google TrayKeys即可。因为不想用静态链接dll的方式,于是用LoadLibrary GetProcAddress等函数。与公司另一个Hook的dll的载入方式作比较,写下了一些载入的代码。结果GetProcAddress返回的地址为空,导致的原因是GetProcAddress的传入参数必须是name mangling之后的标识符才能正常导入函数,关于详细点的信息可以看下面的这个链接。http://blog.youkuaiyun.com/enjolras/archive/2010原创 2011-02-26 13:17:00 · 1136 阅读 · 0 评论 -
string头文件与cstring头文件
首先说string的头文件1、包装了std的C++头文件2、旧的C头文件3、旧C头文件的std版本,切记,这不是cstring的头文件原创 2011-01-28 21:34:00 · 14736 阅读 · 0 评论 -
inline关键字
首先说一下使用inline关键字的好处:1、预处理(define)只是单纯的代码替换,使用inline可以解决define宏只是替换代码产生的问题,因为他像函数一样运作。2、inline不需要承担函数调用的开销。本质上它也是代码展开。inline关键字的坏处:1、代码膨胀inline void test(){ std::cout}test();//将产生如下汇编代码004012B1 mov eax,dword ptr [__imp_std::endl (403084h)] 004012B6原创 2011-01-29 16:05:00 · 1709 阅读 · 0 评论 -
CFILEFIND的排序——递归与循环遍历目录中函数的剥离
由于CFILEFIND在查找文件的时候返回的顺序不能确定,所以我们要对CFILEFIND的结果放入容器进行排序。以下是CFILEFIND函数的说明The FindNextFile function searches for files by name only; it cannot be used for attribute-based searches. It searches both the long and short file names.In rare cases, file attribute原创 2011-01-26 12:03:00 · 2633 阅读 · 0 评论 -
标题暂无,日后再总结
<br />在用一个vc6工程代码的时候出现了如题的错误,google之后发现大部分文章都是说是字符集问题。而实际的问题是vector< char >的iterator不能被转化为char指针,解决办法很简单,由类似 (vectorChar.Begin()+i) 改为 (&vectorChar.Front()+i)的方法解决。<br />本也不是个问题,可为什么vc6可以转而vc9要改动呢?望有牛人告知。<br /> <br />另外还遇到一个错误,本来截了图,忘记传网盘了,回公司补充吧。<br />问题在原创 2010-11-24 20:59:00 · 698 阅读 · 0 评论 -
内存泄露解决记录——BSTR字符串释放与VARIANT类型的释放
发现的内存泄露有两种,一种是上篇提到的,某些窗口没有用DestroyWindow来释放资源,而是自己写的一个ForceClose函数,这导致了某些函数没被调用,比如PostNcDestroy。另外就是一个内嵌浏览器中使用到的BSTR字符串没有释放造成的问题。String Manipulation Functions Descriptions SysAllocStringCreates and initializes a string.SysAllocStringByteLenCreates a zero-t原创 2011-01-19 11:58:00 · 3048 阅读 · 0 评论 -
c调用c++
<br />可以在C代码中调用C++的函数,要满足以下条件 <br />* 被调用C++函数要使用extern C声明,这样 <br /> o 多个重载函数中只能有一个函数被声明成extern C,只有这个函数能 <br /> 被C代码访问。 <br /> o 你不能在函数的参数列表中使用类和引用,C代码没办法处理引用或者 <br /> 成员函数或者虚函数什么的。 <br /> o 你也没办法使用namespace,C代码不懂得这个。要在转载 2010-11-21 10:44:00 · 460 阅读 · 0 评论 -
关于C++对象的自杀
<br /><br />转自:http://blog.youkuaiyun.com/jasonblog/archive/2010/11/05/5989224.aspx<br />前两天看到一个问题,一个类的成员函数是否可以delete this ?<br />据出题者的意思来看,是认为这样的问题一般比较少人会遇到,而这样就可以了解一下对方对未知问题的分析和解决思路。<br /><br />出于这点,我也想看看自己的思路,所以就先自己思考了一下。<br /> 1. 要使用delete,那么对象需要使用new来实例化转载 2010-11-21 10:42:00 · 443 阅读 · 0 评论 -
split函数模板版本
//功能:split的TCHAR模板版本,用splitter将字符串分割成多个,并分别压进vector容器中//返回值:容器中的字符串数量。//参数1:需要被分割的字符串//参数2:splitter//参数3:vector容器的引用,结果放进参数3中//参数4: 是否计算末尾的splittertemplate unsigned int split( const TCHAR* str, const TCHAR* delim, std::vector& results, bool empties = false原创 2011-02-21 20:36:00 · 776 阅读 · 0 评论 -
CMutex CSingleLock
如下为CMutex的类定义class CMutex : public CSyncObject{ DECLARE_DYNAMIC(CMutex)// Constructorpublic: /* explicit */ CMutex(BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL);// Implementationpublic:原创 2011-05-31 22:02:00 · 5856 阅读 · 3 评论 -
GetBuffer 与 ReleaseBuffer
之前对GetBuffer与ReleaseBuffer的理解有误也是因为受了网上的误导。ReleaseBuffer并不会释放空间!Getbuffer(int nMinBufferLength)函数作用:分配空间并返回字符串首地址指针。若为默认参数,则若nMinBufferLength比当前已分配空间小,则当前分配空间不变。若比当前分配空间大,则分配不小于nMinBufferLength的空间。VC9中会每次分配空间的时候会多分配一点避免频繁分配空间,而VC6中是指定多少就是多少,这点最好通过测试代码验证一下。原创 2011-04-21 21:39:00 · 2722 阅读 · 0 评论 -
一个维护成本低,容易修改的makefile
我对makefile的理解很简单:目标的依赖关系与目标创建规则。列一下此前在makefile使用上遇到过的槛,希望看到这篇文章的人不再遇到:1、如何将中间文件输入到一个指定的目录。2、如何遍历目录获得构建的目标。3、如何生成依赖关系。原创 2014-01-14 17:56:54 · 1072 阅读 · 0 评论 -
操作系统学习笔记:存储管理
类似进程线程是对CPU的抽象。存储管理,是操作系统对存储器(内存)的抽象。读书时对分页,分段,这些概念一知半解。很重要的原因是我没有去思考,为什么要有这些概念?它们是为了解决什么问题?技术的本质是分解问题,抽象问题,乃至解决问题。而分页,分段这些抽象,就是为了解决一些具体的问题而建立的。问题1:用户程序直接访问物理地址,破坏其它程序(操作系统)内存。解决方案:保护与重定位。原创 2013-04-30 11:45:07 · 1149 阅读 · 1 评论 -
map与unordered_map效率的比较
之前在某blog看到map在非常少量数据下插入效率高于unordered_map。自己测了一下并非如此,在设置合适的桶数的情况下,有如下结论:1、插入效率unordered_map任何情况下均优于map,数据越多越明显。2、遍历效率map略优于unordered_map。补充:1、只在 g++ 4.4.6下测试,-o2与无编译器优化结果一致。2、没有计算rehash与计算素原创 2012-11-21 22:37:49 · 4232 阅读 · 0 评论 -
ABCABC…
迅雷笔试题:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。Windows(VC9下编译运行通过):#include #include #include using namespace std;#define PRINT_TIMES 10/原创 2012-04-13 10:10:00 · 1222 阅读 · 0 评论 -
linux 多线程编程
转自:http://www.cnblogs.com/BiffoLee/archive/2011/11/18/2254540.html1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型。Linux是一种“多进程单线程”的操作系统。Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。转载 2012-04-12 09:29:49 · 680 阅读 · 0 评论 -
静态库包含静态库
都知道静态库是不能包含动态库的,那么静态库能不能包含静态库呢?以静态库的本质来说,理应是可以的,经过一番试验之后确定可行:第一步:创建静态库 libother.aother.h:#ifndef OTHER_H#define OTHER_Hextern "C"{ void vFuncOther();}#endifother.cpp:#inclu原创 2012-02-29 22:53:33 · 3987 阅读 · 0 评论 -
glibc版本冲突导致的Floating point exception
readhat5下编译的程序在readhat4下运行提示Floating point exception.确认为gcc版本冲突导致。解决办法如下:加入链接选项:-Wl,--hash-style=sysv[enjolras@localhost qt3test]$ gcc --help用法:gcc [选项] 文件...选项:...... -Wl,原创 2012-02-09 00:11:54 · 2521 阅读 · 0 评论 -
Win32下OpenSSL的安装方法
Win32下OpenSSL的安装方法环境: VC++, ActivePerl1. 下载openssl源代码: http://www.openssl.org/2. 配置D:\openssl-0.9.8a>perl Configure VC-WIN32D:转载 2011-09-06 15:51:19 · 979 阅读 · 0 评论 -
C++ 字符串操作经验集
<br /> 转自:http://blog.youkuaiyun.com/elthe/archive/2006/10/02/1316780.aspxC++ 字符串操作经验集 1. 字符类型和字符串lchar,wchar_t,CHAR,BYTE,UCHAR,WCHAR,TCHAR,TBYTEchar是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。wchar_t是char的Unicode版本。相当于unsigned short。一般两个字节。CHAR 和WCHAR分别是char和wch转载 2010-11-21 10:41:00 · 619 阅读 · 1 评论 -
VC内存泄漏检测工具_Visual Leak Detector
<br /><br />灵活自由是C/C++语言的一大特色,而这也为C/C++程序员出了一个难题。当程序越来越复杂时,内存的管理也会变得越加复杂,稍有不慎就会出现内存问 题。内存泄漏是最常见的内存问题之一。内存泄漏如果不是很严重,在短时间内对程序不会有太大的影响,这也使得内存泄漏问题有很强的隐蔽性,不容易被发现。 然而不管内存泄漏多么轻微,当程序长时间运行时,其破坏力是惊人的,从性能下降到内存耗尽,甚至会影响到其他程序的正常运行。另外内存问题的一个共同特点 是,内存问题本身并不会有很明显的现象,当有异常现象转载 2010-11-21 10:39:00 · 427 阅读 · 0 评论 -
C++虚函数表解析
<br /><br /> <br />C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。<br />关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数转载 2010-11-21 10:30:00 · 406 阅读 · 0 评论 -
无法解析,该符号在函数 ___tmainCRTStartup 中被引用
<br /><br />一,问题描述<br />MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用<br />Debug/jk.exe : fatal error LNK1120: 1 个无法解析的外部命令<br />error LNK2001: unresolved external symbol _WinMain@16<br />debug/main.exe:fata转载 2010-11-21 10:29:00 · 1575 阅读 · 0 评论 -
atoi.itoa.回文数.strcpy.strcmp
<br /> 1.//整数转换成字符串itoa函数的实现 <br /> 2. #include "stdafx.h" <br /> 3. #include <iostream> <br /> 4. using namespace std; <br /> 5. void itoaTest(int num,char str[] ) <br /> 6. { <br /> 7. int sign = num,i = 0,j = 0; <br /> 8.转载 2010-11-21 10:26:00 · 448 阅读 · 0 评论 -
内存泄露解决记录——窗口资源释放
前段时间在解决代码的内存泄露问题,解决了部分内存泄露问题。http://blog.youkuaiyun.com/enjolras/archive/2011/01/05/6117628.aspx这篇文章起到了很好的指引作用,让我对MFC里宏观方面的释放有了一定了解。总结一下就是:1、推荐用DestroyWindow来销毁窗口(或者从窗口派生的对象)。2、重载PostNcDestroy函数通过调用基类的PostNcDestroy函数,如:Cwnd::PostNcDestroy,以及通过delete th原创 2011-01-07 13:09:00 · 2930 阅读 · 0 评论 -
调试用函数:用对话框显示LastError
网上有几个都不太对,下面的代码已经测试通过inline void ShowErrMsg() { TCHAR errorBuffer[1024];memset(errorBuffer, 0, 1024*sizeof(TCHAR));LPVOID lpMsgBuf;DWORD dw = GetLastError();FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,dw,MAKELANGID(LANG_N原创 2011-01-05 13:00:00 · 2402 阅读 · 0 评论 -
Technical Notes 17 : Destroying Window Objects(销毁窗口对象)
MSDN连接:http://msdn.microsoft.com/en-us/library/5zba4hah.aspx转帖连接:http://blog.youkuaiyun.com/badboyfind/archive/2007/11/28/1906298.aspxDestroying Window Objects(销毁窗口对象)[1]TN017: Destroying Window Objects销毁窗口对象This note describes the use of the CWnd::PostNcDestroy转载 2011-01-05 12:50:00 · 1308 阅读 · 0 评论 -
MFC遍历目录
<br />很久之前就用到了,今天再次用到遍历目录,记录如下:<br />若用*.jpg或者类似的,不能找到子文件夹,因为目录不在*.jpg的范围内。<br />isdot是用来判断是否./或者../,每个文件夹都有这样两个隐藏的目录,代表当前目录与上级目录,若不排除这两种情况将导致死循环。<br /> <br />void CTestDlg::ergodicDir(CString strDir)<br />{<br /> CFileFind tempFind; <br /> TCHAR sTempFil原创 2010-12-28 18:09:00 · 1135 阅读 · 0 评论 -
C++基础知识复习 const关键字
没事翻了下C++ primer,开卷有益吧,加深下印象,留个复习记录如下:1、const 指针与指向 const对象的指针const int * p;/*指向const int 的指针*/int * const p;/*指向int的const指针*/记忆方法:从右往左读,*读作is a pointer to。2、const形参在非引用或非指针传值时,const修饰符无意义,因为复制传值的时候,不可能改变实参的值。const int &与int &不同可作为区分函数重载的标识。没有int const &,引用原创 2010-12-23 21:04:00 · 599 阅读 · 0 评论 -
对读取的配置字符串批量处理的可变参数函数
代码很清楚了,本来是每个地方都用CString作临时变量再Replace,后面改成用一个函数集中处理,记录如下原创 2010-12-22 13:00:00 · 545 阅读 · 0 评论 -
placement delete
<br /><br />一个new的过程大致分两步:<br />- 申请内存<br />- 调用构造函数构造新对象<br /><br /><br />如果第一步成功而第二步失败,一个成熟的系统应该能回撤第一步,释放刚分配的内存空间。<br />如果第一步用的是普通的new函数,C++是能够找到与之匹配的delete函数的。<br />//normal form of new operator<br />void* operator new(std::size_t) throw(std::bad_alloc)转载 2010-11-21 10:37:00 · 1575 阅读 · 0 评论 -
safe_delete
<br /><br /> <br />safe_delete(p)的若干心得<br /><br /><br />#define safe_delete(p) do{ delete p; p=NULL; } while(false) <br /><br /><br /> 这种写法的意义不是显而易见的,而且还有另外一种版本的safe_delete(),在此就不写了,同样的令人费解——或者说让初学C++编程的人费解。<br /><br /><br /> 其实如此做的目的就是为了让程序更健壮。<br转载 2010-11-21 10:37:00 · 1602 阅读 · 0 评论 -
C++内存泄漏检测
<br /><br />如何检查C++中的内存泄漏<br /> 内存泄漏是编程中常常见到的一个问题,我所遇过的原因有两个:<br />1.分配完内存后忘记回收<br />2.代码有问题,造成想回收却无法回收,例如:<br />int* p=new int;<br />p=new int; //p指针修改,原来申请内存的地址没有记录下来,于是无法释放<br /> 下面介绍如何检查内存泄漏:<br />1.包含头文件和定义<br />#define _CRTDBG_MAP_ALLOC //并非绝对需要该转载 2010-11-21 10:38:00 · 482 阅读 · 0 评论 -
Placement new、operator new、new operator 完全释疑
<br /><br />首先我们区分下几个容易混淆的关键词:<br />new(也称作new operator)、operator new、placement new。看如下代码:<br />1: class MyClass {...}; <br />2: MyClass *p = new MyClass; <br /><br /><br />这里的new是上述三个关键字中的第一个,成为new操作符。实际上它执行如下3个过程:<br />1. 调用operator new分配内存<br />2. 调用构造函转载 2010-11-21 10:35:00 · 337 阅读 · 0 评论 -
typedef的四个用途和两个陷阱
<br /><br />问题内容:typedef的四个用途和两个陷阱<br />原讨论链接:http://community.youkuaiyun.com/expert/topicview1.asp?id=5298039<br />所属论坛:C++ 语言 审核组:C/C++<br />提问者:Dragon_Red 解决者:Dragon_Red<br />感谢:huangyangman ugg littlebao YourKing fosjos<br />关键字:函数 C/C++ 变量 指针 C++ 语言转载 2010-11-21 10:34:00 · 468 阅读 · 0 评论 -
预处理器标识
<br /> #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编译下面代码 #ifdef 如果宏已经定义,则编译下面代码 #ifndef 如果宏没有定义,则编译下面代码 #elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码转载 2010-11-21 10:28:00 · 458 阅读 · 0 评论 -
C++ 四种类型转换方式
<br /><br />去VS有遇到这道题,只记得static_cast,dynamic_cast这两种,而且是只记得名字..在C++primer上看到过,没好好记一下,毕竟没用过,在此做个记录。。<br /><br /> 具体归纳如下:<br /> reinterpret_cast<br /> 该函数将一个类型的指针转换为另一个类型的指针.<br /> 这种转换不用修改指针变量值存放格式(不改变指针变量值),只需在编译时重新解释指针的类型就可做到.<br /> reinterpret_cast转载 2010-11-21 10:28:00 · 903 阅读 · 0 评论 -
内存的分配
<br />一、一个经过编译的C/C++的程序占用的内存分成以下几个部分:<br />1、栈区(stack):由编译器自动分配和释放 ,存放函数的参数值、局部变量的值等,甚至函数的调用过程都是用栈来完成。其操作方式类似于数据结构中的栈。<br />2、堆区(heap) :一般由程序员手动申请以及释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式类似于链表。<br />3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变转载 2010-11-21 10:25:00 · 379 阅读 · 0 评论