
C++
文章平均质量分 74
ysu108
这个作者很懒,什么都没留下…
展开
-
用Debug Diagnostic诊断内存泄露问题
用Debug Diagnostic诊断内存泄露问题调试一个MFC的程序,发现解决内存泄露问题,用Debug Diagnostic Tool1.2 1. 在定位的时候,需要注意多跑几次,多诊断几次,线程很多的话,每次的结果可能不一样,给的Call stack sample也可能不一样,不行就多跑一会。 2. 即使多跑几次,堆栈信息也可能不足以一次定位到问题。给了一些分配内存大小的信息“Top原创 2017-04-14 15:06:12 · 1425 阅读 · 0 评论 -
函数对象
函数对象其实就是个类对象(与仿函数差不多),只不过重载了()这个方法,而且能够保存状态(在对象内部),而且c++好多stl接口都支持(一个优势,for_each),而且c++提供了构造函数对象的方法(不必去写一个仿函数,可以用Lambda表达式构造,可以用mem_fun_ref或者mem_fun构造,也可以用boost::bind()构造)。关于lambda表达式可以参考:http://m原创 2014-08-29 09:28:34 · 792 阅读 · 0 评论 -
unique_ptr
先看看auto_ptr是什么东西,"This class template is deprecated as of C++11. unique_ptr is a new facility with a similar functionality, but with improved security (no fake copy assignments), added features (del原创 2014-09-10 11:20:56 · 1816 阅读 · 0 评论 -
auto_ptr到底能不能作为容器的元素?
【摘要】对C++语言本身来说,它并不在乎用户把什么类型的对象作为STL容器的元素,因为模板类型参数在理论上可以为任何类型。比如说STL容器仅支持“值”语义而不支持“引用(&)”语义,并非因为模板类型参数不能为引用,而是因为如果容器元素为引用类型,就会出现“引用的引用”、“引用的指针”等C++语言不支持的语法和语义。智能指针是一种模拟原始指针行为的对象,因此理论上也可以作为容器的元素,就象原始指针可转载 2014-09-10 09:38:41 · 1717 阅读 · 0 评论 -
慎用读写锁
之所以要“慎用”,是因为能够利用读写锁真正达到想要的效果的情景不多,如果情景使用不正确,使用的效率还不如一般的锁。而且使用读写锁有一个非常容易的错误,在读锁递归使用时(重入时)如果有写锁lock,很多的实现版本上会发生死锁。下面详细说明。Be wary of readers/writer locks. If there is a novice error when trying to brea原创 2014-09-17 15:27:10 · 7217 阅读 · 1 评论 -
C++11与编译器支持
_MSC_VER是MSVC编译器的内置宏,定义了编译器的版本,_MSC_VER 值对应版本关系MSVC++ 11.0 _MSC_VER = 1700 (Visual Studio 2012) MSVC++ 10.0 _MSC_VER = 1600 (Visual Studio 2010) MSVC++ 9.0 _MSC_VER = 1500 (Visual Studio 2008)原创 2014-06-21 09:59:34 · 2882 阅读 · 0 评论 -
STL学习(三)仿函数
两个例子,仿函数与其他特性结合起来功能貌似很强大,自己不是怎么理解。下面是两个Demo#include #include #include #include using namespace std;//functor initclass IntSequence{public: //constructor IntSequence(int initial原创 2013-05-31 16:42:38 · 900 阅读 · 0 评论 -
dll文件生成使用
dll文件生成 vc编译器与gcc的编译原理是一样的,个别的函数像printf可能编译结果不大一样。程序生成的基本过程就是编译,链接。编译大体上也分三部分,预处理,编译,汇编,因为编译过程最复杂,所以这三步一般合起来叫编译。以前的有讨论过http://blog.youkuaiyun.com/ysu108/article/details/7529273。每个.cpp文件在windows都会生成一个ob原创 2013-05-23 09:11:53 · 5301 阅读 · 1 评论 -
定时器队列
定时器属于基本的基础组件,不管是用户空间的程序开发,还是内核空间的程序开发,很多时候都需要有定时器作为基础组件的支持,但使用场景的不同,对定时器的实现考虑也不尽相同,本文讨论了在 Linux 环境下,应用层和内核层的定时器的各种实现方法,并分析了各种实现方法的利弊以及适宜的使用环境。 首先,给出一个基本模型,定时器的实现,需要具备以下几个行为,这也是在后面评判各种定时器实现的一个基转载 2014-03-06 18:42:38 · 3366 阅读 · 0 评论 -
命令池的实现
图1 命令池类图一、首先要清楚命令池要实现的功能 学习代码为了帮助分析,大概总结了下,最基本的功能有如下几个:开启执行线程,设置命令回调接口,记录线程对命令的执行时间,命令执行的调度算法。类图就是按照这几个主要的功能来实现的,CThreadRunner类为记录线程运行时间的类。二、对于设计的一点疑问 为什么CSchedule使用继承,而CC原创 2013-08-05 10:37:37 · 1248 阅读 · 0 评论 -
有限自动机
1.是什么不是什么自己理解,有限自动机是一种数学模型,是自动机的一种,是一种方法也可以理解为工具,是一种理论可以应用用到编程中。不是编程特有的理论,数电里面好多应用,不是一种设计模式,状态模式可以体现这种思想。有些类似UML有自己的规定和表示图形,不过是解决特定问题的。2.有限状态机编程(英语:FSM-based programming)大致上等同于自动机编程,但有限状态机编程专指原创 2013-09-13 11:28:45 · 1299 阅读 · 0 评论 -
Effective C++ 笔记
条款12:尽量使用类的初始化列表而不是构造函数对类的成员变量初始化。 这个主要优点三个:1.如果有继承关系,使用初始化列表可能少调用一次类成员变量的构造函数,直接调用拷贝构造函数。 2.可以满足const和引用成员初始化的要求。(同时可以有一定扩展性,可以适应原来的非const变成const原创 2013-08-09 13:45:28 · 1985 阅读 · 0 评论 -
异常机制
把错误变成正常,不至于程序彻底崩溃,甚至用户体会不到错误内建的异常机制都是沿着函数调用栈的函数调用逆向搜索,直到遇到异常处理代码为止。一般在这个异常处理代码的搜索过程中逐级完成栈卷回(stack unwinding)。一般而言,在处理异常的时候,抛出异常的块中的局部存储不存在了,但是在块中new出来的对象,该内存不会释放。不能不处理异常,如果找不到匹配的catc原创 2013-08-08 16:50:58 · 661 阅读 · 0 评论 -
容器使用经验总结
第1章容器第1条:慎重选择容器类型。标准STL序列容器:vector、string、deque和list。标准STL关联容器:set、multiset、map和multimap。非标准序列容器slist和rope。slist是一个单向链表,rope本质上是一“重型”string。非标准的关联容器hash_set、hase_multiset、hash_map和hash_multi转载 2013-06-04 14:29:16 · 831 阅读 · 0 评论 -
多线程中condition wait
一般在多线程编程中都会用到condition_wait,在linux下也就是pthread_cond_wait这个系统调用,大多高性能的多线程程序也离不开这基本的东西。在看线程调度代码的时候突然想起这个方法,一直用ace,很操作系统的东西都忘得差不多了。条件变量与互斥量一起使用从可以允许线程以无竞争的方式等待特定的条件发生。为什么必须一起使用呢?1)假如当某个资源满足了一定的条件时它要发送原创 2014-08-30 16:17:16 · 10456 阅读 · 0 评论 -
闭包(closure)
在这篇文章中知道有闭包这个东西,http://blog.youkuaiyun.com/solstice/article/details/3066268,开始去网上查,对此概念理解都说的云里雾里好像很神奇,其实最后看下来,在c++中,只是函数对象出现恰好符合了闭包的定义,并没有什么新的机制,一点点特别的机制都没。至少在上面文章中,所谓的闭包就是一个“能够保存状态的函数对象”,其实所有函数对象都有这个特性,所以说原创 2014-09-13 14:14:44 · 797 阅读 · 0 评论 -
NASA 的 10 大编程规则
第 1 条规则 — 简单的控制流用非常简单的控制流结构体来编写程序 — 不要用 setjmp 或者 longjmp 结构体,goto 语句,以及直接或间接的递归调用。理由:简单的控制流能够提高代码的清晰度以及拥有更强大的验证能力。不使用递归,就不会产生循环函数调用关系图,同时这也证明应该是有界的执行过程确实是有界的。PS:这也是“结构化编程”的一个表现。控制流要清晰,一下就能看明白。此外,感觉回调也原创 2016-08-05 14:16:10 · 1089 阅读 · 0 评论 -
单元测试框架
公司的没有单元测试的要求,也没有单元测试的相关规范。基本都是随机测试,随便写点测试代码,也没有维护过测试代码,提交版本测试代码也就扔了。开始认为单元测试费力不讨好,认为小的功能不需要这玩意,随着做开发时间变长,才觉得这玩意很有必要。写之前先总结下我理解的单元测试。一、必要性1)开发人员能够对代码设思考,写出更易读,结构性更好代码 不是所有的代码都可以很优雅进行单元测试的。单元测试要求代码有较好的内原创 2015-12-31 16:51:23 · 1249 阅读 · 0 评论 -
boost bind性能开销分析
#include <boost/bind.hpp>#include <boost/function.hpp>#include <boost/scoped_ptr.hpp>#include <Windows.h>#include <stdio.h>#define MAX_LOOP 1000*1000*8typedef boost::function1<void, int> Funtor;st原创 2015-11-02 14:54:02 · 1189 阅读 · 0 评论 -
Google编码规范
PS:Google的编码规范,与其他编码规范相比比较特殊的地方就是对异常、智能指针的使用,异常要求不使用,智能指针也就是用个scope_ptr。异常C++中使用的本来就不多,不使用异常理由有捕获可能遗漏处理在一些情况下容易出错、破坏了结构化程序流等。与少于智能指针一样,容易导致错误。 其他的还有“不要用省略字母的缩写”,尽量用单词全拼,“并不完美的代码使用 TODO 注释。”,拷贝构造函数的默认禁原创 2015-08-26 09:48:46 · 1066 阅读 · 0 评论 -
http协议学习和总结系列
蜜果私塾:http协议学习和总结系列——协议详解篇文:阿蜜果日期:2009-11-301. 基础概念篇1.1 介绍HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写。它的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineeri转载 2015-08-08 16:49:42 · 835 阅读 · 0 评论 -
linux 下 c++ 多线程的实现
看了不少文章,好多都很复杂,终于今天写了一个线程池,大概架构如下Task类,很简单就是完成具体的任务,c上是用struct存储的,c的具体的process(),用一个函数指针class Task{ public: Task(); ~Task(); int process(原创 2015-08-08 16:25:31 · 1058 阅读 · 0 评论 -
dynamic 锁竞争等系统开销分析
1. dynamic_cast#include #include using namespace std;class Base{public: virtual void show(){};};class Derived : public Base{public: virtual void show(){};};int main(int argc, ch原创 2015-04-01 15:55:54 · 787 阅读 · 0 评论 -
JVM类加载机制
在用JDBC的时候遇到的一个用法:Class.forName("org.firebirdsql.jdbc.FBDriver");Connection conn = DriverManager.getConnection(...); 第一句其实就是加载类FBDriver,并且实例初始化了一个类的对象,在这个FBDriver中很可能把自己注册给了DriverManager原创 2015-03-02 10:15:39 · 598 阅读 · 0 评论 -
boost智能指针
share_ptr 使用的注意点:1.避免对shared_ptr所管理的对象的直接内存管理操作,以免造成该对象的重释放也就是不能 delete (sp1->) 或者 delete sp1.get();这样直接操作内存会造成对象重复释放。2.shared_ptr并不能对循环引用的对象内存自动管理(这点是其它各种引用计数管理内存方式的通病)。3.不要构造一个临时的shared_原创 2014-12-25 11:17:06 · 1245 阅读 · 0 评论 -
Real-World Concurrency
Know your cold paths from your hot paths. If there is one piece of advice to dispense to those who must develop parallel systems, it is to know which paths through your code you want to be able to e翻译 2014-09-26 14:14:08 · 4060 阅读 · 0 评论 -
C++中的delegate
《以boost::function和boost:bind取代虚函数》,原文链接:http://blog.youkuaiyun.com/solstice/article/details/3066268 ,很多年前的一篇blog,感觉收获颇丰。第一个问题,虚函数是否可以被取代?--完全可以。虚函数一般是用来实现多态,或者说是接口与实现分析。可以直接拿作者的例子来举例: 上面可以说是对象装配的过原创 2014-09-13 16:19:01 · 4810 阅读 · 0 评论 -
随笔(2014.9)
1. 智能指针问题都可以在代码中使用引用记数的方式替代掉,如果待删除的对象同时最多只被一个对象回调,那么可以用一个flag来表示“计数”,对象请求发送后与回调后改变这个标志位。2. time_t表示1970年0点到现在的秒数。3. 对于异步消息的问题,可能出现一种恶性循环情况,当服务器处理不了很多请求的时候,如果客户端定时发送异步请求那么服务器的未处理请求就会越来越多,而客户端获取到的请求原创 2014-09-26 14:27:27 · 597 阅读 · 0 评论 -
STL学习(四)阶段简单总结
特别注意1.在使用容器的时候,最好不要自己写循环dequedeque也采用动态数组来管理内存,而且动态数组头尾都开放,操作上也与vector几乎一样。下面是与vector相比不同的地方。1.在存取元素的时候,deque的内部结构会多一个间接过程,所以元素的存取和迭代器的动作会稍微慢一些。2.deque可以内含更多元素,因为它使用不止一块内存,因此deque的max_size可能原创 2013-05-31 16:44:51 · 777 阅读 · 0 评论 -
STL学习(二)set、map、list、deque简单Demo
几个Demo,《C++标准程序库》上的例子,书里面的STL貌似是SGI版本的,在vc上有的好多跑不动,在suse10上可以跑起来。set的简单应用#include #include using namespace std;int main(int, char *[]){ set > c; for (int i=1; i<7; i++) { c.inse原创 2013-05-31 16:37:49 · 938 阅读 · 0 评论 -
STL版本
HP STLHP STL是所有其它STL实现版本的根源。它是STL之父Alexander Stepanov在惠普的Palo Alto实验室工作时,和Meng Lee共同完成的,是第一个STL的实现版本(参见1.2节)。这个STL是开放源码的,所以它允许任何人免费使用、复制、修改、发布和销售该软件和相关文档,前提是必须在所有相关文件中加入HP STL的版本信息和授权信息。现在已经很少直接使用这个转载 2013-05-29 14:15:56 · 785 阅读 · 0 评论 -
C++题目(三)
1.在排序算法中,元素比较次数与初始排列无关的是:冒泡、选择、归并、有关的是:插入、快排、shell、堆(有点关系,好像关系不打)2.10 != 9的结果为?这个题目在VC上编译sizeof(10!=9)为4,在gcc上编译结果为1。不同编译器有不同的结果,可能为int 1 也可能为bool false。3.函数声明void fun(int a=0, int b)是否正确?原创 2012-08-30 19:45:55 · 1399 阅读 · 0 评论 -
C++ 题目(一)
题目(一)求输出结果#include using namespace std;struct Point3D{ int x; int y; int z;};int main (){ Point3D *pPoint = NULL; int offset = (int) (&(pPoint)->z); printf ("%d", o原创 2012-08-16 16:44:19 · 1031 阅读 · 0 评论 -
this指针
先看几个题目,参考何海涛100题。题目(一)程序的输出结果#include using namespace std;class A{private: int m_value; public: A(int value) { m_value = value;原创 2012-08-16 16:48:44 · 1985 阅读 · 0 评论 -
关于const关键字
1.const 与 #define的比较(1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。(这点到没有遇到过)在C++ 程序中只使用const常量而不使用宏常量,即const常原创 2012-06-14 10:56:34 · 958 阅读 · 0 评论 -
memmove和ALIGN函数
关于memcpy和memmove函数,linux的man上说的“ The memcpy() function copies n bytes from memory area src to memory area dest. The memory areas should not overlap. Use memmove() if the memory areas do overlap.”就是原创 2012-07-23 13:50:17 · 2037 阅读 · 0 评论 -
C++类型转换机制
可以分为隐式类型转换和显示类型转换,显示类型转换也称为强制类型转换(cast),有四种名字命名的强制类型转换操作符:static_cast、dynamic_cast、const_cast、reinterpret_cast。隐式的类型转换比较常见,在混合的类型表达式中经常发生。最简单的为整型提升,对于所有比int小的整型,包括char、signed char、unsigned char、shor原创 2012-07-15 22:25:41 · 1572 阅读 · 0 评论 -
sizeof 操作符
这是一个西山居的笔试题一、sizeof属于C++内置函数?不对,它应该属于一个操作符,在编译期间计算好的。MSDN中这样描述:The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This原创 2012-05-28 16:13:09 · 794 阅读 · 0 评论 -
数组与指针
对此问题的探讨始于西山居的一个笔试题,笔试没过,宣讲会得了个大抱枕~~题目如下:void main(){ int aa[2][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int *ptr1 = (int*)(&aa+1); int *ptr2 = (int*)(*(aa+1)); printf("%d,%d", *(ptr1-1), *(pt原创 2012-06-04 14:59:42 · 1655 阅读 · 0 评论 -
面向对象的理解
今天发现一本好书,设计模式精解,作者是Alan Shalloway和James R.Trott,薄薄的一本,但是讲的很清楚,也让我对面向对象和设计模式有了多一点的理解。记得去三星实习生面试的时候面试过就问过一个问题,谈谈对面向对象的理解,我当时就只说了一个多态,而且感觉没有条理,所以今天趁着看过书,总结下这个问题。Object Oriented,OO这个概念已经知道很多年了,但是感觉距离真正的原创 2012-06-26 22:09:10 · 875 阅读 · 0 评论