C++/C 编程
文章平均质量分 93
rickypc
这个作者很懒,什么都没留下…
展开
-
std::sort 宕机
一次公司项目代码引发了宕机,源于std::sort。相似代码贴在下面。由于std::sort 第三个参数写的不对造成的。源码:using Vec = std::vector<std::pair<int, int>>;void print_elem(const Vec& vec, const std::string& str){ std::stringstream oss; for (const auto& item : vec)原创 2021-09-23 17:36:03 · 718 阅读 · 0 评论 -
关于 std::sort 不稳定的研究
概述std::sort 是不稳定的排序。在使用的时候,需要严格遵守排序准则,否则会导致异常产生。问题描述外网玩家发来bug:某天晚上,一个排行榜发生第一名A和第二名B,在数据为发生变化的情况下,会不停的交替更换。经查,该排行榜的排序规则functor 是bool compare_function(const std::shared_ptr<Data> lhs, const std::shared_ptr<Data> rhs){ if (lhs->原创 2020-10-10 18:18:35 · 1085 阅读 · 0 评论 -
Dump 文件生成与分析
<br /> 最近两天由于项目的需要,研究了一下Dump文件相关的知识,今天做一个小节(由于研究不久并且第一次写blog,希望网友们看到不要见笑)。<br /> Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。 <br /> Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开,比如使用WinDbg打开。<br /> 当我们的程序发布出去之后,在客户机上是无法跟踪自己代码的bug的,所以Dump(扩展名是 .dmp原创 2010-10-05 20:41:00 · 51584 阅读 · 0 评论 -
利用VS2005进行dump文件调试(转)
http://arizona.javaeye.com/blog/711029转载 2010-10-03 16:04:00 · 1623 阅读 · 0 评论 -
共享内存---shmget shmat shmdt
要使用共享内存,应该有如下步骤:1.开辟一块共享内存 shmget()2.允许本进程使用共某块共享内存 shmat()3.写入/读出4.禁止本进程使用这块共享内存 shmdt()5.删除这块共享内存 shmctl()或者命令行下ipcrmftok()。它有两个参数,一个是字符串,一个是字符。字符串一般用当前进程的程序名,字符一般用来标记这个标识符所标识的共享内存是这个进程所开辟的第几个共享内存。ftok()会返回一个key_t型的值,也就是计算出来的标识符的值。shmkey = ftok( "mcut" ,转载 2010-09-06 17:54:00 · 653 阅读 · 0 评论 -
挂钩技术学习笔记
<br />这篇文章是学习WINDOW编程中的一篇文章.以后还会有更多的学习笔记.本来我这个人是比较懒的,.学完的东西又不会做笔记.所以经常是看完后,没多久就忘光光了.这样导致了我学习东西非常的没有效率.因此以后每学一些东西都会做写笔记,或画一些简单的图<br />. <br /> <br /> <br />HOOK分为三种:LOCAL HOOK 和 REMOTE HOOK,还有一种是<br />SYSTEM-WIDE <br /> <br /> <br />LOCAL HOOK。LOCAL HOOK就是指转载 2010-09-08 21:06:00 · 586 阅读 · 0 评论 -
Windows挂钩的简单使用
<br />最近手机上的短信存储器快满了,应该删除一些短信以留出一些空间,但是有好多短信是各个MM发过来的,舍不得就这么删除了,想导出到电脑里面保存起来。万一哪天MM成了我女朋友了,有机会的时候可以给她看看,说明我是这么珍惜跟她相关的点点滴滴。^_^于是用数据线把手机连接到电脑上,打开EasyGPRS软件,读取手机中的短信到列表窗口中。但是可惜的是EasyGPRS软件没有提供导出短信内容的功能,于是只好自己想办法了。当然最简单的方法是,把各条短信的接收时间,对方号码,内容等信息在电脑上输入一遍,保存到文件中转载 2010-09-08 18:13:00 · 1073 阅读 · 0 评论 -
error LNK2005: _DllMain@12 already defined in MSVC
<br />http://www.programfan.com/blog/article.asp?id=38029转载 2010-09-06 14:17:00 · 557 阅读 · 0 评论 -
C/C++基础知识:typedef用法小结
<br />第一、四个用途<br />用途一:<br />定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:<br />char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, <br />// 和一个字符变量;<br />以下则可行:<br />typedef char* PCHAR; // 一般用大写<br />PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针<br />虽然:<br />char *pa, *p转载 2010-08-24 11:25:00 · 323 阅读 · 0 评论 -
详细解说STL hash_map系列
<br />0 为什么需要hash_map <br />用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个<br />人名和相应的存储,而且随时增加,要快速查找和修改: <br />岳不群-华山派掌门人,人称君子剑 <br />张三丰-武当掌门人,太极拳创始人 <br />东方不败-第一高手,葵花宝典 <br />...这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"的信息,最傻的方法就<br />是取得所有的记录,然后按照名转载 2010-08-13 00:37:00 · 400 阅读 · 0 评论 -
使用map和hash_map的效率问题
<br />实际上这个问题不光C++会遇到,其他所有语言的标准容器的实现及选择上都是要考虑的。做应用程序你可能觉得影响不大,但是写算法或者核心代码就要小心了。今天改进代码,顺便又来温习基础功课了。 <br /><br /><br /> 还记得Herb Sutter那极有味道的《C++对话系列》么,在其中《产生真正的hash对象》这个故事里就讲了map的选择。顺便回顾一下,也讲一下我在实用中的理解。 <br /><br /> 选择map容器,是为了更快的从关键字查找到相关的对象。与使用list这样的线性表转载 2010-08-12 17:27:00 · 1043 阅读 · 0 评论 -
实例讲解如何使用C++操作MySQL数据库类
/* * project: * 通用模块 ( 用 c++ 处理 mysql 数据库类,像ADO ) * * description: * * 通过DataBase,RecordSet,Record,Field类,实现对mysql数据库的操作 * 包括连接、修改、添加、删除、查询等等,像ADO一样操作数据库,使 * 用方便 * * ( the end of this file have one sample, * welcom to use... ) * * * file:zlb_mysql.h * * au转载 2010-08-03 18:47:00 · 1099 阅读 · 0 评论 -
VS2005 调试不能设置断点的解决办法
<br />【 1】<br />以前也遇到过同样的问题,但没有问个为什么,也没有探个毕竟。昨天调试一个DLL,添加输出信息吧,太麻烦而且不轻易定位,<br /> 但设置断点后按“F5”,断点不可用,气泡提示“当前不会命中断点,还没有为该文档加载任何符号。<br /> ”再右键->“位置”->“答应源代码与原始版本不同”,还是不行。77777我还不信了,整它! <br /> 后来才发现,“Alt+F7”->“配置属性”->“调试”->“命令”中输入的 exe 路径下,已经提供了此 DLL,<br /> 压根就转载 2010-08-02 11:16:00 · 563 阅读 · 0 评论 -
C++资源之不完全导引
<br />本文为介绍性文章,会随笔者学习C++语言不断更新。<br />前言<br />无数次听到“我要开始学习C++!”的呐喊,无数次听到“C++太复杂了,我真的学不会”的无奈。Stan Lippman先生曾在《C++ Primer》一书中指出“C++是最为难学的高级程序设计语言之一”,人们常将“之一”去掉以表达自己对C++的敬畏。诚然,C++程序设计语言对于学习者的确有很多难以逾越的鸿沟,体系结构的庞大,应接不暇并不断扩充的特性……除此之外,参考资料之多与冗杂使它的学习者望而却步,欲求深入者苦不堪言。转载 2010-11-26 15:57:00 · 2386 阅读 · 0 评论 -
std::map C++
std::map C++<br />C++ Builder2010-06-04 11:37:53阅读226评论0 字号:大中小 订阅<br />std::map 再学习<br />1. map中的元素其实就是一个pair。<br />2. map的键一般不能是指针,比如int*,char*之类的,会出错。常用的就用string了,int也行。<br />3. map是个无序的容器,而vector之类是有序的。所谓有序无序是指放入的元素并不是按一定顺序放进去的转载 2010-10-12 18:56:00 · 1965 阅读 · 0 评论 -
C++中的指针与引用
http://www.eb163.com/home/space-20374-do-blog-id-5590.html转载 2010-10-12 18:06:00 · 677 阅读 · 0 评论 -
在vs2010中编译log4cxx-0.10.0详细方法
http://blog.sina.com.cn/s/blog_a459dcf501013tbn.html转载 2013-03-04 22:33:19 · 940 阅读 · 0 评论 -
C++日志系统log4cxx使用总结
http://blog.sina.com.cn/s/blog_a459dcf501013mr1.html转载 2013-03-04 22:32:33 · 829 阅读 · 0 评论 -
ASIO学习
boost::asio::Io_service构造函数构造函数的主要动作就是调用CreateIoCompletionPort创建了一个初始iocp。Dispatch和post的区别Post一定是PostQueuedCompletionStatus并且在GetQueuedCompletionStatus 之后执行。Dispatch会首先检查当前thread是不是io_serv转载 2012-05-24 10:30:31 · 1081 阅读 · 0 评论 -
一个很好的学习Boost库的网站
<br />http://zh.highscore.de/cpp/boost/原创 2011-04-10 23:59:00 · 999 阅读 · 0 评论 -
Boost 库中的实用工具类使用入门
<br /> 简介: 实用工具类开发和维护会耗费程序员的时间。Boost 通过提供几个高质量的库,从而简化了此过程,您可以将这些库轻松集成到现有的代码库中。本文简单概述一些较流行的 Boost 实用工具类,并帮助您了解如何将它们投入使用。<br /> <br />实用工具类(utility classes)在几乎任何适当规模的 C++ 项目中都是必需的,但是不存在满足此需求的标准方法。通常,团队根据他们的需求编写实用工具类代码,但是由于缺少重要的接口信息,使得相同组织中的其他项目团队无法重用那些转载 2011-03-24 11:05:00 · 908 阅读 · 0 评论 -
c++boost组件简介:数据结构,容器,迭代器和算法
<br />简介:这是c++boost组件简介:数据结构,容器,迭代器和算法的详细页面,介绍了和c/c++,,c++,boost,组件简介:数据结构,,容器,,迭代器和算法,,,,有关的知识、技巧、经验,和一些c/c++源码等<br /> <br /> 数据结构, 容器, 迭代器, 和算法boost.any<br />any库支持类型安全地存储和获取任意类型的值。当你需要一个可变的类型时,有三种可能的解决方案:<br />无限制的类型,如 void*. 这种方法不可能是类型安全的,应该象逃避灾难一样避免它。转载 2011-03-13 16:06:00 · 1667 阅读 · 0 评论 -
Visual.Assist.X.V10.6.1825正式发行版 以及的破解补丁[推荐]
<br />VA更新速度真快,又针对VS2010更新很多了,<br />现提供破解补丁和VA软件安装文件一起打包,<br />VA安装文件从官方下载可放心使用,如果你不放心可以自己去官方下载最新版,<br />官方地址<br />破解补丁来自吾爱破解<br />下载地址<br />此次VA安装包可以不分VS版本,一次安装共所有版本使用.<br />下载安装完毕之后,直接运行补丁,点击patch即可,输入你要注册的用户名,<br />补丁会自动覆盖安装文件下的VA_X.dll文件,此方法安装后vs6到vs20转载 2011-01-21 10:14:00 · 1228 阅读 · 0 评论 -
WinSock学习笔记(一)
<br /> Socket(套接字)<br /><br />◆先看定义:typedef unsigned int u_int;typedef u_int SOCKET;<br />◆Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接,双方就可以发送和接收数据了。其定义类似于文件句柄的定义。<br /><br />◆Socket有五种不同的类型:<br /><br />1、流式套接字(stream socket)<br />定义:#define SOCK_STR转载 2010-11-19 11:44:00 · 543 阅读 · 0 评论 -
WinSock学习笔记(二)
<br /> <br /><br /> 与socket有关的一些函数介绍<br /><br />1、读取当前错误值:每次发生错误时,如果要对具体问题进行处理,那么就应该调用这个函数取得错误代码。 int WSAGetLastError(void );#define h_errno WSAGetLastError()<br />错误值请自己阅读Winsock2.h。<br /><br />2、将主机的unsigned long值转换为网络字节顺序(32位):为什么要这样做呢?因为不同转载 2010-11-19 11:40:00 · 655 阅读 · 0 评论 -
浅谈C++中内存泄漏的检测
<br />首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复。<br />最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck,功能非常强大,相信做C++开发的人都离不开它。此外就是不使用任何工具,而是自己来实现对内存泄露的监控,分如下两种情况:<br />一. 在 MFC 中检测内存泄漏<br />假如是用MFC的程序的话,很简单。默认的就有内存泄露检测的功能。<br />我们用VS2005生成了一个MFC的对话框的程序,发现他可以自动的检测内转载 2010-11-16 13:56:00 · 855 阅读 · 0 评论 -
std::vector与std::list的执行速度比较 (C/C++) (STL)
<br />STL中的container各有专长,最常用的是std::vector,可以完全取代array,第二常用的是std::list。std::vector的优点在于non-sequential access超快,新增数据于数据后端超快,但insert和erase任意资料则相当缓慢;std::list则是insert和erase速度超快,但non-sequential access超慢,此范例以实际时间比较vector和list间的优缺点。<br /> 1/**//* <br /> 2(C) OO转载 2010-11-04 15:37:00 · 3166 阅读 · 0 评论 -
C运行时库详解
<br />运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的。C运行时库诞生于20世纪70年代,当时的程序世界还很单纯,应用程序都是单线程的,多任务或多线程机制在此时还属于新观念。所以这个时期的C运行时库都是单线程的。 <br /> 随着操作系统多线程技术的发展,最初的C运行时库无法满足程序的需求,出现了严重的问题。C运行时库使用了多个全局变量(例如errno)和静态变量,这可能在多线程程序中引起冲突。假设两个线程都同时设置errno,其结果是后设置的errno会将先前的覆盖转载 2010-07-18 17:46:00 · 432 阅读 · 0 评论 -
CreateThread()、_beginthread()以及_beginthreadex()联系与区别
<br />联系: <br />CreateThread、_beginthread和_beginthreadex都是用来启动线程的。 <br />区别: <br />_beginthread是_beginthreadex的功能子集,_beginthreadex是微软的C/C++运行时库函数,CreateThread是操作系统的函数。虽然_beginthread内部是调用_beginthreadex但他屏蔽了象安全特性这样的功能,所以_beginthread与CreateThread不是同等级别,_begin转载 2010-07-18 17:45:00 · 644 阅读 · 0 评论 -
C/C++判断文件/文件夹是否存在
<br />一、判断文件夹是否存在:<br /> 1.用CreateDirectory(".//FileManege",NULL);如果文件夹FileManege不存在,则创建。<br /> 2.或者if(_access(".//FileManege",0)==-1),表示FileManege不存在。<br /> 3.或者BOOL PathIsDirectory(LPCTSTR pszPath);<br />二、判断文件是否存在:<br /> 1.用if((file=fope转载 2010-07-09 13:02:00 · 21380 阅读 · 0 评论 -
解析#pragma指令
转自:http://topic.csdn.net/t/20031213/19/2560854.html 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的转载 2009-08-13 16:38:00 · 359 阅读 · 0 评论 -
预定义,宏定义
转自:http://www.cnblogs.com/ppchouyou/archive/2008/07/04/1235360.html 宏定义:其作用就是“换其名曰”,给程序中的一段特殊的代码--函数,数据取了个简单明了的名字。不过有一点这家伙的作用范围是全局的。即使它是在某一个函数块中定义的。这个其实也容易理解。因为宏定义是预定义的一种,在我们的程序之前,由预编译器(Cpp)提转载 2009-08-11 17:53:00 · 1163 阅读 · 0 评论 -
C语言宏定义技巧
转自:http://blog.21ic.com/user1/69/archives/2006/13695.htmlC语言宏定义技巧(常用宏定义) 写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。 1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF转载 2009-08-11 17:32:00 · 382 阅读 · 0 评论 -
lib和dll文件的区别和联系
转自:http://hi.baidu.com/bigccyy/blog/item/bbf86963d45f43600d33fa08.html lib和dll lib和dll文件的区别和联系 .dll是在你的程序运行的时候才连接的文件,因此它是一种比较小的可执行文件格式,.dll还有其他的文件格式如.ocx等,所有的.dll文件都是可执行。.lib是在你的程序编译连接的时候就连接的文转载 2009-08-07 17:42:00 · 400 阅读 · 0 评论 -
[C++ rudiment]如何生成自己的静态库(lib)文件
转自:http://www.cnblogs.com/krisdy/archive/2009/06/17/1505042.html 打开VS2005,建立一个win32控制台程序,然后打开项目--LibTest属性(如图1),打开LibTest属性页(如图2),在右边配置类型处选择静态库(lib)。然后我们就可以写我们的头文件和cpp源文件了。写完后编译下就可以在目录下找到相应转载 2009-08-10 14:20:00 · 572 阅读 · 0 评论 -
关于Debug和Release之本质区别的讨论
转自:http://www.builder.com.cn/2008/0706/964938.shtml一、Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。 Debug 和 Re转载 2009-08-07 17:26:00 · 318 阅读 · 0 评论 -
C++与MySQL的接口(Windows)
转自:http://scut-cottontang.blog.sohu.com/116994925.html 花了两天的时间,终于基本搞明白C++与开源数据库软件MySQL的接口问题了。网上很多资料说得都很散,来,看兄弟我来总结一下这其中碰到的问题,同时也为每个问题提供一个解决方案:1 需要什么头文件?标准C++没有提供专门的数据库操作接口函数,相应的接口函数都由第三方提供。M转载 2009-08-04 11:49:00 · 5863 阅读 · 1 评论 -
The Standard Librarian: What Are Allocators Good For?
http://www.cuj.com/experts/1812/austern.htm?topic=experts--------------------------------------------------------------------------------Allocator是C++语言标准库中最神秘的部分之一。它们很少被显式使用,标准也没有明确出它们应该在什么时候被使用。转载 2009-07-23 15:46:00 · 608 阅读 · 0 评论 -
数组的智能初始化
转自:http://www.gd-emb.org/detail/id-34295.html 数组的智能初始化 不少人使用的数组初始化方法是这样的: int a[100]; for (int i = 0; i 一个for循环的初始化方法效率显然不够高,代码也不够漂亮。其实 C++ Standard Library早已为我们提供了一个又与初始化的强力工具 memset。 void me转载 2009-07-20 12:40:00 · 459 阅读 · 0 评论 -
深入理解sizeof
深入理解sizeof作者:房秉毅 最近在论坛里总有人问关于sizeof的问题,并且本人对这个问题也一直没有得到很好的解决,索性今天对它来个较为详细的总结,同时结合strlen进行比较,如果能对大家有点点帮助,这是我最大的欣慰了。一、好首先看看sizeof和strlen在MSDN上的定义:首先看一MSDN上如何对sizeof进行定义的:sizeof Operatorsizeof e转载 2009-07-20 11:11:00 · 346 阅读 · 0 评论