
C++
文章平均质量分 53
百炼成钢
这个作者很懒,什么都没留下…
展开
-
why use assertions in code
why?they make debugging easier.The time consuming part of debugging is tracing a problem from the symptom you first notice back to the error in the code. Well written assertions will make the sy转载 2014-01-21 10:26:03 · 748 阅读 · 0 评论 -
c++ - inline放在哪好
Best practice: only in the definition outside the class body. class Foo { public: void method(); ← best practice: don't put the inline keyword here ... }; inline void Foo::method()转载 2012-01-19 12:58:03 · 559 阅读 · 0 评论 -
C++中,exit和return有什么不同?
总能看到,但是你知道这两者有什么不同呢?------------------------------------------------------------------------exit() is used to exit the program as a whole. In other words it returns control to the operating sy原创 2012-01-10 13:06:33 · 1347 阅读 · 0 评论 -
MFC中BOOL和bool的区别大不大
这个问题,一般都不是问题。 不过细想,还是大有洞天的!什么是BOOL?mfc中是“typedef int BOOL;”两者区别在哪里?首先BOOL的性能更好。用bool来和一个int比较时,会有cast,而BOOL不会有,因为BOOL本身就是一个int。汇编代码上的区别可以参考http://www.codercorner.com/Bools.htm的片段。但是B转载 2012-01-10 13:33:21 · 5279 阅读 · 0 评论 -
C++中小心谨慎的为数组分配空间
为自定义类型的数组分配空间得小心,陷阱很多。首先,如下code是有问题的。T* at = new T[1];delete aT; //Error! using delete []保持new[]和delete[]正确的成对使用很重要,因为数组的分配和归还所使用的函数不同于非数组;数组用operator new[]和operator delete[],而非数组使用opera转载 2011-07-30 23:58:03 · 833 阅读 · 0 评论 -
编写异常安全的C++函数
编写异常安全的代码,最困难的地方不在于抛出或捕获异常,而是在抛出和捕获之间我们应该怎么做:必须清理所控制的任何重要资源。以下为例。string& string::operator = (const char * str) { delete [] s_; if (! str) str = ""; s_ = strcpy( new char [ strl转载 2011-07-31 10:26:54 · 405 阅读 · 0 评论 -
不要写过于聪明的代码(兼C++中的new和异常)
有一个著名的原则,叫做KISS -- keep it simple and stupid。大概就是说,能简单就简单,简单的实现方式更可靠,过犹不及。以处理new中的exception为例。为了编写完美的异常安全的代码,有必要保持对任何已分配资源的跟踪并且时刻准备着当异常发生时释放他们。我们既可以将代码组织为无需回收资源的方式(参考http://blog.youkuaiyun.com/fishhg原创 2011-07-31 15:32:24 · 519 阅读 · 0 评论 -
C++ - 智能指针 Vs. auto_ptr
智能指针是一个好东西:跟内建指针一样使用,但是可以自动释放heap上得资源。智能指针是一个类类型(通常采用类模板来实现),它乔装成一个指针,但额外提供了内建指针无法提供的能力。通常而言,一个智能指针使用类的构造函数、析构函数和复制操作符所提供的能力。来控制(或跟踪)对它所指向的东西的访问。所有的智能指针都重载->和*操作符,有的甚至还重载了->*操作符(参见“指向类成员的指针并非指针”转载 2011-07-31 23:57:27 · 433 阅读 · 0 评论 -
C++ - Precompile header file
缘起In the C and C++ programming languages, aheader file is afile whose text may be automatically included in anothersource file by theC preprocessor, usually specified by the use ofco转载 2011-06-02 16:14:00 · 1483 阅读 · 0 评论 -
C/C++中怎么使用Const
C++中的Const 当你只在定义该const 常量的文件中使用该常量时,c++不给你的const常量分配空间----这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const int c=0;相当于#define c 0; 当在当前文件之外使用时,c++会给你的const分配空间(它是迫不得已)。因为若此时如果不分配空间,转载 2011-08-09 17:29:39 · 530 阅读 · 0 评论 -
C++中delete的时候要小心incomplete class types
缘起The C++ Standard allows, in 5.3.5/5, pointers to incomplete class types to be deleted with a delete-expression. When the class has a non-trivial destructor, or a class-specific operator delete,转载 2011-08-07 16:31:08 · 3929 阅读 · 0 评论 -
使用STL的vector要留意几点
vector是用于访问的container中的所有元素,而一个list则用于在其中所有位置上进行插入操作。为什么呢?vector的底层实现是一片连续的存储区,像是一个数组。如果元素个数超过现有空间,vector会先分配一块新的、更大的存储区,接着将旧数据copy到新存储区,然后销毁旧存储区,最好释放旧存储区。这就是所谓的“溢出“导致的重分配,有的时候这个代价不小。一旦底层的原创 2011-10-30 21:13:38 · 422 阅读 · 0 评论 -
VC++的编译错误信息让人很迷惑啊
随便写了下面的这段代码。#include using namespace std;class CBase{public: const string& Name() { return "CBase"; }原创 2011-09-27 16:40:53 · 307 阅读 · 0 评论 -
C++ - Memory Layout of Virtual Inherit (虚继承的内存布局)
Virtual Table是如何实现的呢? 1. single inherit的简单情况 A virtual table is a static look up array that the compiler sets up at compile time.A virtual table contains one entry for each virtual function原创 2011-03-28 14:31:00 · 1180 阅读 · 0 评论 -
cross DLL problems
Dll的问题除了version control等问题(blog.youkuaiyun.com/fishhg/article/details/7256931),还有一个cross DLL 问题。why?最简单的情况是,在不同dll里面的new与delete可能被链接到不同的代码,这样也许会造成用一个内存管理的实现去释放另一个内存管理的实现分配的内存,从而带来怪异问题。这是编译和链接的问题。原创 2012-03-15 20:24:31 · 1175 阅读 · 0 评论 -
怎样debug一闪而过的exe
很多时候一个program会调用其它辅助exe;不过这些exe很快运行完毕,一闪而过;来不及通过attach的方式来debug。有几个小技巧可以用用:getchar();//这个还不错,不过有的时候可能不起作用,因为getchar拿到非你manual输入的东西sleep(3000);//这个时间设置的长点,肯定来得及attach的ASSERT(false);//这个只对debu原创 2011-06-13 17:10:00 · 831 阅读 · 0 评论 -
C++ - 数值比较numerical comparison
在工作碰到好几次不同type的integer/value比较出错,导致奇怪的bug。很小的问题,却不容忽视。看几个例子.原来我的想法是他们bitwise level是一样的,这4个比较应该都是true才对。char m_costBasis1;UINT1 m_costBasis2;//define unsigned char UINT1UINT2 l_BasisNum; //d原创 2013-12-20 14:18:39 · 949 阅读 · 0 评论 -
C++重要知识点
最近在准备c++的考试。真没想到工作之后的单位会组织这种考试,还专门开发了考试系统。慢慢来完善这个帖子吧。希望不会半途而废。 ---------------------------------------------------------------- 从公司的现在的情况来看,跟面向对象相关的继承、虚函数等方面的错误都相对容易找到。而跟memory相关的memory leak、m原创 2010-09-11 09:56:00 · 554 阅读 · 0 评论 -
c++ - 为什么头文件里只申明不实现
C++为什么不能把函数实现放在头文件里?以前一直觉得这样写不符合规范,因为头文件可能会expose给client,但是实现不应该expose给client。最近偷懒,把实现放在头文件里,发现还有一个c++编译的原因。 Hi.h#pragm once Void Hi() {Printf(“hello”);}a.cpp原创 2013-08-14 12:32:07 · 2634 阅读 · 0 评论 -
GC陷阱
都说C++的很容易内存泄漏,所以有了GC。有了GC,爸妈再也不用担心我的学习(J)。但是使用GC也有几个大陷阱要注意。 第一个是资源被一直引用。当然都是无意中造成(谁会存心这么做?拉出去突突了)。常见的就是event的handler;有用+=,但是忘了-=。如果handler中有大量资源,而且不再被使用了,也会造成内存“泄露”。还有就是一些static的引用,它们的生命周期一直到a原创 2013-01-04 17:18:42 · 477 阅读 · 0 评论 -
C++ freeing static variables referring heap resource
It will have static lifetime and be destroyed after main returns:static std::auto_ptrT> thePointer;Another option is to register your own atexit function:// staticvoid YourClass::fre转载 2012-08-17 13:16:38 · 330 阅读 · 0 评论 -
Why don't structs support inheritance?
假设.net中的struct可以inherit。现有这样的代码:BaseStruct a;SubStruct b; //inherits from BaseStruct, added fields, etc.a = b; //?? expand size during assignment?这会出什么问题?因为struct是value type不是reference type,原创 2012-07-25 13:10:59 · 448 阅读 · 0 评论 -
C++ - Cast的对比
static_cast 主要有如下几种用法: ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。 ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要原创 2011-04-02 00:25:00 · 409 阅读 · 0 评论 -
VC++运行时的出错信息 不可不仔细读
今天跑了了一个z.exe,但是一跑就出错:Entry Point Not Found!详细信息是"The procedure entry point could not be locateded in the dynamic link library xxx.dll"。这个详细信息中间是一长串由?,@ ,$和不成完整单词的word组成。问了一下对这个功能熟悉的原创 2012-05-30 17:41:37 · 490 阅读 · 0 评论 -
C++ - Static关键字怎么用
The static keyword is probably the most confusing keyword in the C++ language. This is because it has different meanings depending on where it is used.(static很令人迷惑,因为在不同的地方有不同的用途)You know,转载 2011-07-07 16:23:51 · 535 阅读 · 0 评论 -
C++/CLI Stack Overflow Error
同事碰到一个stack overflow的错误。通常这有2中常见的原因:1. infinit recursion2. large local object(structure, array) 第一种是逻辑错误,一般死循环都是边界条件缺失或者不完备;第二种,解决方案是在heap上而不是stack上分配。 不过我同事的问题是repeatly exception导致的stac原创 2011-02-16 16:17:00 · 2395 阅读 · 2 评论 -
什么地方必须用reference而不能用pointer
运算符重载以及inline函数。运算符也是一种函数,也应该可以重载;他可以达到code精炼、提高可读性、降低复杂度的目的。原创 2012-04-02 13:46:24 · 364 阅读 · 0 评论 -
c++方面的好书
C++这方面的经典书籍有不少,我自己看过几本,记录下每次的感受,供以后再次阅读时来参考:Effective C++:很实用,编程常见问题都涉及到了;很透彻,每个问题都分析比较具体全面。C++ Common Knowledge把一些常常被误解原创 2011-05-10 22:35:00 · 439 阅读 · 0 评论 -
MFC多线程编程的几点经验 (防止死锁)
1) 不要在线程函数体内操作MFC控件,不要再线程里面调用UpdateData函数更新用户界面,而应该尽量采用发送消息的方式,在主线程的消息响应函数中操作控件;2)不建议采用SendMessage往主线程发送消息,因为它是同步的,阻塞的,可以考虑采用PostMessage代替转载 2011-08-23 12:28:31 · 1351 阅读 · 0 评论 -
how to initialize Static data member in C++ (怎样初始化类的static数据成员)
The declaration of a static data member in the member list of a class is not adefinition. You must define the static member outside of the c转载 2011-08-09 13:08:48 · 1220 阅读 · 0 评论 -
C++ - 常量成员函数的含义
在类X的非常量成员函数中,this指针的类型为X*const。也就是说,它是指向非常量X的常量指针。而在类X的常量成员函数中,this的类型为constX *const。也就是说,是指向常量X的常量指针。这就是常量成员函数和非常量成员函数的区别。对成员函数的this指针类型加上常量修饰符,就可以解释函数重载解析是符合区分一个成员函数的常量和非常量版本的转载 2011-04-20 01:15:00 · 535 阅读 · 0 评论 -
C++ - Dynamic Cast的使用
dynamic_cast与其他几个cast的对比可以参见http://blog.youkuaiyun.com/fishhg/archive/2011/04/02/6296255.aspx 这个帖子主要来补充几点。原创 2011-04-20 00:47:00 · 616 阅读 · 0 评论 -
C++必知必会 - 赋值和初始化并不相同
赋值发生于当你赋值时,除此之外,遇到所有其他的复制的情形均为初始化,包括声明、函数返回、参数传递以及捕获异常中的初始化。对于内置类型来说,这两个动作的区别可能不是很明显。对于复杂的用户自定义类型来说,目标在采用源重新初始化之前必须被清理掉;这样看,赋值有点像一个析构函数后跟着一个构造函数(当然要先判断=左右是否是同一个object)。转载 2011-04-20 20:34:00 · 507 阅读 · 0 评论 -
c++ - 常量指针与指向常量的指针
这是两个初学者容易混淆的概念。比如,T *pt = new T;const T *pct = pt;//指向常量(const T)的指针T * const cpt = pt;//常量指针,指向T转载 2011-04-20 00:17:00 · 418 阅读 · 0 评论 -
c++ - 数组形参的退化/自动转换
C++中根本不存在所谓的“数组形参”,因为数组在传入时,实质上只传入指向其首元素的指针:void average(int ary[12]);//形参是一个int *这种从数组到指针的自动转换被称之为“退化”。转载 2011-04-19 23:45:00 · 660 阅读 · 0 评论 -
c++ - 编译器会在类中放东西 & 使用抽象数据
在C++中,安全和可移植的编程实践,确实需要对类对象的结构和布局保持某种程度的“健康的不知情”.对于一个类而言,并非总是“所见即所得”。编译器会在类中放东西,而且不同平台的编译器之间的实现并不一致。比如虚指针的位置,可能在对象的头部,也有可能在尾部。我们得到的启示就是,应该在高层操纵类对象,而不应该把它当成一组位的集合。在不同的平台上,高层的操作将会做相同的事情,但它们的底层实现可能并不相同。原创 2011-04-20 01:28:00 · 331 阅读 · 0 评论 -
C++ - 构造函数
构造函数和析构函数分别管理对象的建立和释放,负责对象的诞生和死亡的过程。当一个对象诞生时,构造函数负责创建并初始化对象的内部环境,包括分配内存、创建内部对象和打开相关的外部资源,等等。而当对象死亡时,析构函数负责关闭资源、释放内部的对象和已分配的内存。 在对象生死攸关的地方,如果程序代码出现问题,常常会发生内存泄漏,从而产生可能危害系统运行的孤魂野鬼。大量的事实表明,业务逻辑代码写得非常严谨的程序在运行中仍然发现存在内存泄露,大都是构造和析构部分的代码存在问题。转载 2011-04-06 20:09:00 · 364 阅读 · 0 评论 -
c++ - 为什么空类实例大小不是0
首先:我们要知道什么是类的实例化,所谓类的实例化就是在内存中分配一块地址.转载 2011-04-06 19:26:00 · 467 阅读 · 0 评论 -
C++ - 为什么析构函数不允许抛出异常
C++异常处理模型是为C++语言量身设计的,更进一步的说,它实际上也是为C++语言中面向对象而服务的,C++异常处理模型最大的特点和优势就是对C++中的面向对象提供了最强大的无缝支持。好的,既然如此!那么如果对象在运行期间出现了异常,C++异常处理模型有责任清除那些由于出现异常所导致的已经失效了的对象(也即对象超出了它原来的作用域),并释放对象原来所分配的资源,这就是调用这些对象的析构函数来完成释放资源的任务,所以从这个意义上说,析构函数已经变成了异常处理的一部分。转载 2011-04-06 19:23:00 · 608 阅读 · 0 评论 -
C++必知必会 - RAII(资源获取及初始化)
RAII(资源获取及初始化),即resource acquisition is initialization;他不是某些人以为的“初始化即资源获取”(initialization is resource acquisition)。这对于一些重要资源非常重要,比如内存,文件句柄,网络连接,数据库连接以及审计追踪(audit trail)PAII基本技术原理很简单,如果希望保持对某个重要资源的跟踪,那么创建一个对象,并将资源的生命期和对象的生命期相关联。这样的话,就可以利用c++复杂老练的对象管理机制来管理转载 2011-05-12 09:19:00 · 2915 阅读 · 0 评论