摘要:今天我在维护一个C项目的时候发现有的函数内部有很多的return语句,每个return前面都有一段相同的资源释放的代码。代码看起来就像这样:int f() { char *p1 = (char*)malloc(1024 * sizeof(char)); int *p2 = (int*)malloc(10 * sizeof(int)); ... if (...) { free(p1); free(p2); return 1; } for (...) { if (...) { free(p1); free(p2); return 2; } } ... free(p1); free(p2); re.
阅读全文
摘要:boost::mutex is not re-entrant, a thread can only lock it once, otherwise it’s dead-locked. If you need re-entrant mutex, the boost::recursive_mutex is the choice.
阅读全文
摘要:在面向对象程序设计中,有时我们需要在运行时查询一个对象是否能作为某种多态类型使用。与Java的instanceof,以及C#的as、is运算符类似,C++ 提供了dynamic_cast函数用于动态转型。相比C风格的强制类型转换和C++ reinterpret_cast,dynamic_cast提供了类型安全检查,是一种基于能力查询(Capability Query)的转换,所以在多态类型间进行转换更提倡采用dynamic_cast。本文主要介绍dynamic_cast的意义,用法和注意事项。
阅读全文
摘要:C++语言规范并未包含类似C#静态构造函数的东西,但在使用类之前做初始化工作的需求却是客观存在的。本文尝试通过C++的模版机制模拟实现静态构造函数,避免手动初始化的繁琐实现。本实现具有以下特点:在第一次构造类对象之前自动调用类提供的静态构造函数;静态构造函数被调用的时机是确定的;利用C++的局部静态变量初始化机制保证了线程安全性;基于继承的实现机制并未改变派生类的对象内存布局。
阅读全文
摘要:C#和C++两门语言的定位不同,它们在资源管理方面采取了两种截然不同的方式:一为GC,一为RAII。GC让程序建立在更高的抽象层次上,使资源管理变得更方便,更安全;而RAII则保留了C的底层能力,同时在C++特性的支持下提供了简单有效的资源管理方式。我们知道C++最激烈的批评往往来自于C 社区,而在我看来C程序员可以不接受虚函数,不接受模板,但有什么理由不接受RAII呢?可以说RAII是C++相对C来说几乎无副作用的明显进步。
阅读全文
摘要:比较C#委托和C++函数指针的异同,探讨C++ functor和静多态:1.C#委托对象是真正的对象,C/C++函数指针变量只是函数入口地址;2.C++的委托对象:functor;3.C++的静多态:模版
阅读全文