C++
文章平均质量分 78
liuzhi1218
乐观、积极,喜欢钻研
学习欲望比较强
团队意识强
展开
-
回调函数
简介 对于很多初学者来说,往往觉得回调函数很神秘,很想知道回调函数的工作原理。本文将要解释什么是回调函数、它们有什么好处、为什么要使用它们等等问题,在开始之前,假设你已经熟知了函数指针。 什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。 为什么要使用回调函数转载 2009-09-19 10:03:00 · 569 阅读 · 0 评论 -
C++转型操作符:const_cast、dynamic_cast、static_cast、reinterpret_cast
C++转型操作符 C++通过引进四个新的类型转换操作符克服了C风格类型转换的缺点,这四个操作符是:const_cast( expression ) dynamic_cast( expression ) static_cast( expression ) reinterpret_cast( expression ) 在大多数情况下,对于这些操作符你只需要知道原来你习惯转载 2012-05-01 23:13:52 · 598 阅读 · 0 评论 -
shared_ptr解析
shared_ptr解析《超越C++标准库-Boost库导论》头文件: "boost/shared_ptr.hpp"几乎所有稍微复杂点的程序都需要某种形式的引用计数智能指针。这些智能指针让我们不再需要为了管理被两个或多个对象共享的对象的生存期而编写复杂的逻辑。当引用计数降为零,没有对象再需要这个共享的对象时,这个对象就自动被销毁了。引用计数智能指针可以分为侵入式(intrusive)和转载 2012-05-01 12:54:40 · 4161 阅读 · 0 评论 -
避免引起野指针
1、避免不同的对象拥有同一份堆上分配的指针; 不同对象永远堆上的指针,当某一个对象去把该指针释放了,并把该指针置空(NULL),之后拥有该指针的其他对象再访问指针,判断不为空,但因为已经释放(原对象中虽然已经置空,但本对象却不为空),对这个指针指向的内存进行存取操作,引发访问违规,程序崩掉。或者说某个线程已经进入了对象的成员函数,而另外一个线程同时去释放该对象指针,也讲引起c原创 2012-04-28 10:53:03 · 3967 阅读 · 1 评论 -
当析构函数遇到多线程 ── C++ 中线程安全的对象回调
转自:http://www.cnblogs.com/Solstice/archive/2010/02/10/dtor_meets_threads.html#_Toc8041摘要 编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的互斥器来保护。如何保证即将析构对象 x 的时候,不会有另一个线程正在调用 x 的成员函数?或者说,如何保证在执行 x 的转载 2012-05-01 13:03:17 · 2089 阅读 · 0 评论 -
scoped_ptr解析
scoped_ptr解析《超越C++标准库-Boost库导论》头文件: "boost/scoped_ptr.hpp"boost::scoped_ptr 用于确保动态分配的对象能够被正确地删除。scoped_ptr有着与std::auto_ptr类似的特性,而最大的区别在于它不能转让所有权,然而auto_ptr却可以。事实上,scoped_ptr永远不能被复制或被赋值!scoped_转载 2012-05-01 22:58:23 · 607 阅读 · 0 评论 -
CRITICAL_SECTION同步易出错的地方
众所周知通过CRITICAL_SECTION可以对多个线程同步,然而加锁和解锁的次数不匹配将导致死锁:class CLock{public: CLock() { InitializeCriticalSection(&m_cs); } ~CLock() { DeleteCriticalSection(&m_cs); } void Lock() { Ente原创 2012-05-07 19:58:03 · 1445 阅读 · 1 评论 -
读写锁
多个线程产生race condition,根据业务逻辑,分为共享资源的读和写,多个线程的读不会对数据造成破坏。如果不区分读和写,每次遇到race condition便锁住不允许其他线程访问,造成效率低下。根据以上逻辑,可以用信号量来实现多个线程的共享读,互斥写。//读写递归锁class RWRecLock{public: typedef AutoRLockT AutoRLock原创 2012-05-07 22:18:28 · 621 阅读 · 0 评论 -
c++字节对齐
规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该“变量的类型”或者指定对齐系数所占用的字节数的倍数,当变量类型和指定系数不同时,取小的。整个结构大小按照以上对齐计算,但必须是最大类型大小或者指定对齐系数的整数倍,也就是最后一个成员变量要圆整,当最大类型大小和指定对齐系数不一致的情况,取小的。当成员变量本身是结构体的时候,不能用整个struct大小计算起始地址,而应该用结构体中最大类转载 2012-05-27 10:50:24 · 874 阅读 · 0 评论 -
C++中operator的主要用法
1. operator 用于类型转换函数:类型转换函数的特征:1) 型转换函数定义在源类中;2) 须由 operator 修饰,函数名称是目标类型名或目标类名;3) 函数没有参数,没有返回值,但是有return语句,在return语句中返回目标类型数据或调用目标类的构造函数。类型转换函数主要有两类:1) 对象向基本数据类型转换:对象向不转载 2012-06-12 22:06:40 · 13450 阅读 · 0 评论 -
用SAXXMLReader将XML文件保存为缩进格式,方便阅读
MSXML3.0以上才提供对SAXXMLReader,直接上代码:void SaveToXmlFile( MSXML2::IXMLDOMDocumentPtr docPtr,const wchar_t* XmlFileName ){ HRESULT hr = S_OK; MSXML2::IMXWriterPtr pWriter(__uuidof(MSXML2::MXXMLWriter原创 2011-12-13 10:12:27 · 1832 阅读 · 0 评论 -
堆和栈的区别
一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,转载 2009-09-19 10:18:00 · 349 阅读 · 0 评论 -
让程序随系统启动
Windows启动时通常会有一大堆程序自动启动。不要以为管好了“开始→程序→启动”菜单就万事大吉,实际上,在Windows XP/2K中,让Windows自动启动程序的办法很多,下文告诉你最重要的两个文件夹和八个注册键。 一、当前用户专有的启动文件夹 这是许多应用软件自动启动的常用位置,Windows自动启动放入该文件夹的所有快捷方式。用户启动转载 2009-11-25 09:26:00 · 1089 阅读 · 0 评论 -
SEH转化为C++异常
//==============================================================================//// 项目名 :数据库// 文件名 :XDBWin32Exception.h// 作 者 :// 用 途 :Win32结构化异常封装类。// //===============================原创 2011-11-17 22:49:33 · 780 阅读 · 0 评论 -
SEH转化为C++异常<二>
//==============================================================================//// 项目名 :// 文件名 :XDBExceptionReport.h// 作 者 :// 用 途 :异常报告实现类。// //=====================================原创 2011-11-17 22:56:53 · 834 阅读 · 0 评论 -
SEH转化为C++异常<三>
//==============================================================================//// 项目名 :// 文件名 :XDBExceptionReport.cpp// 作 者 :// 用 途 :异常报告输出实现类。// //=================================原创 2011-11-17 22:58:42 · 1400 阅读 · 0 评论 -
把SEH类型的系统异常转化为C++类型的异常
做一件事情之前,我们最好要搞清为什么!“十万个为什么” 可曾造就了多少顶级奇才!呵呵! WHY? ? WHY ? WHY ?这对任何一个人来说,都绝对是个好习惯,阿愚同学就一直把这个当“宝贝”。那么,究竟 为什么要 把 SEH 类型的系统异常转化为 C++ 类型的异常?朋友们,大家都想想,整理整理自己的意见和想法。这里,阿愚给出它个人的理解,如下: • 首先是由于我们在编程时,仍然最好遵转载 2011-11-17 23:20:58 · 696 阅读 · 0 评论 -
学习笔记:shared_ptr陷阱
条款1:不要把一个原生指针给多个shared_ptr管理int* ptr = new int;shared_ptr p1(ptr);shared_ptr p2(ptr); //logic errorptr对象被删除了2次这种问题比喻成“二龙治水”,在原生指针中也同样可能发生。条款2:不要把this指针给shared_ptrclass Test{public:转载 2011-11-20 18:22:43 · 6934 阅读 · 0 评论 -
cin标准输入流错误清理
cin.sync()函数这个是用来清空cin缓冲区里面未读取的信息...例子: #include using namespace std;int main () { char first, second; cout << "Please, enter a word: "; first=cin.get(); cin.sync();转载 2011-11-19 15:42:41 · 3620 阅读 · 0 评论 -
weak_ptr解决shared_ptr环状引用所引起的内存泄漏
循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象。一个简单的例子如下: #include#include #include #include class parent;class children;typedef boost::shared_ptr parent_ptr;typedef boost::sha转载 2011-11-20 15:13:44 · 10660 阅读 · 1 评论 -
Boost::Utility库 之enable_if
enable_if 头文件: "boost/utility/enable_if.hpp"有时候,我们希望控制某个函数或类模板的特化是否可以加入到重载决议时使用的重载或特化的集合中。例如,考虑一个重载的函数,它有一个版本是带一个int参数的普通函数,另一个版本是一个函数模板,它要求参数类型T 具有一个名为type的嵌套类型。它们看起来可能象这样:void some_func(int转载 2013-10-18 11:03:26 · 2575 阅读 · 0 评论