随笔分类 -  C++

摘要:忘记释放已经分配的内存是一种常见的编程错误,当然我指的是在C++编程当中,例如下面的代码里面就存在一个忘记释放内存的编程错误。我个人觉得忘记释放内存的编程错误是不可避免的,毕竟程序员都是人,困了,心情不好了,代码过于复杂啦等等都可能导致忘记加上一句delete XXX语句。#include <tchar.h>#include <windows.h>#include <string>#include <iostream>using namespace std;class CTestClass{public: CTestClass(LPWSTR sz 阅读全文
posted @ 2011-04-26 18:52 Cranny 阅读(775) 评论(1) 推荐(1) 编辑
摘要:转:http://blog.vckbase.com/arong/archive/2009/12/30/40598.html1. 原理分析经常有些新C++程序员问:C++的类的成员个数是不是有限制,为什么我加一个变量后程序就死了?或者说:是不是成员变量的顺序很重要,为什么我两个成员变量顺序换一换程序就不行了?凡此种种之怪现象,往往都是内存访问越界所致。何谓内存访问越界,简单的说,你向系统申请了一块内存,在使用这块内存的时候,超出了你申请的范围。例如,你明明申请的是100字节的空间,但是你由于某种原因写入了120字节,这就是内存访问越界。内存访问越界的后果是:你的写入破坏了本不属于你的空间。下面是 阅读全文
posted @ 2011-04-19 12:05 Cranny 阅读(3165) 评论(0) 推荐(0) 编辑
摘要:http://hi.baidu.com/socai/blog/item/8132e7872a953823c75cc3f5.htmlsc和c++调式 利用宏获得函数名仅仅为了获取函数名,就在函数体中嵌入硬编码的字符串,这种方法单调乏味还易导致错误,不如看一下怎样使用新的C99特性,在程序运行时获取函数名吧。 对象反射库、调试工具及代码分析器,经常会需要在运行时访问函数的名称,直到不久前,唯一能完成此 项任务并且可移植的方法,是手工在函数体内嵌入一个带有该函数名的硬编码字符串,不必说,这种方法非常单调无奇,并且轻易导致错误。本文将要演示怎样使用 新的C99特性,在运行时获取函数名。 那么怎样以编程 阅读全文
posted @ 2011-03-08 11:38 Cranny 阅读(2037) 评论(0) 推荐(0) 编辑
摘要:http://hi.baidu.com/shshwangzzu/blog/item/e77357763882cc11b151b9ff.htmlDebug和Release有什么区别?转载: Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于ATL的,则Debug和Release版本对DLL的要求差不多。如果采用的编译选项为使用MFC动态库,则需要MFC42D.DLL等库支持,而Release版本需要MFC42.DLL支持。Release Build不对源代码进行调试,不考虑MFC的诊断宏,使用的是MFC 阅读全文
posted @ 2011-03-08 10:27 Cranny 阅读(532) 评论(0) 推荐(0) 编辑
摘要:#include <stdio.h>#include <stdlib.h>//#define NDEBUG //禁用NDBUG#include <assert.h>typedef unsigned char byte;#define DEBUG //自定义的断言宏/* memcpy ─── 拷贝不重叠的内存块*/void* memcpy(void* pvTo, void* pvFrom, size_t size){ byte* pbTo = (byte*)pvTo; byte* pbFrom = (byte*)pvFrom; if(pvTo == NULL 阅读全文
posted @ 2011-03-05 17:57 Cranny 阅读(337) 评论(0) 推荐(0) 编辑
摘要:#include #include using namespace std; class Screen; class ScreenPtr; class Screen { public: typedef string::size_type index; Screen(int r = 4, int c = 3) { contents.resize(r * c, '#'); he... 阅读全文
posted @ 2011-01-13 20:24 Cranny 阅读(256) 评论(0) 推荐(0) 编辑
摘要:#include using namespace std; class ClassA { public: int m_data1; int m_data2; void func1(){} void func2(){} virtual void vfunc1(){} virtual void vfunc2(){} }; class ClassB : public Clas... 阅读全文
posted @ 2011-01-03 20:06 Cranny 阅读(166) 评论(0) 推荐(0) 编辑
摘要:许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus)。当一种类型S的对齐模数与另一种类型T的对齐模数的比值是大于1的整数,我们就称类型S的对齐要求比T强(严格),而称T比S弱(宽松)。这种强制的要求一来简化了处理器与内存之间传输系... 阅读全文
posted @ 2010-11-05 21:59 Cranny 阅读(1424) 评论(0) 推荐(0) 编辑
摘要:#include using namespace std; class Furniture { public: Furniture(){} void SetWeight(unsigned i) { weight = i; } unsigned GetWeight() { return weight; } protected: unsigned weight; }; ... 阅读全文
posted @ 2010-10-14 13:56 Cranny 阅读(270) 评论(0) 推荐(0) 编辑
摘要:#include using namespace std; class OBJ1 { public: OBJ1() { cout<<"construct OBJ1"<<endl; } }; class OBJ2 { public: OBJ2() { cout<<"construct OBJ2"<<endl; } }; class Base1 { public: Ba... 阅读全文
posted @ 2010-10-14 13:47 Cranny 阅读(193) 评论(0) 推荐(0) 编辑
摘要://account.h #pragma once #include using namespace std; class Account { public: Account(void); ~Account(void); Account(unsigned accNo,float balan = 0.0); int AccountNo(); float AcntBalan(); s... 阅读全文
posted @ 2010-10-14 13:02 Cranny 阅读(214) 评论(0) 推荐(0) 编辑
摘要:#include #include using namespace std; class Person { public: Person(char *pN = "no name") { cout<<"Constructing "<<pN<<endl; pName = new char[strlen(pN) + 1]; if (pName) { strcpy(pNa... 阅读全文
posted @ 2010-10-13 19:11 Cranny 阅读(278) 评论(1) 推荐(0) 编辑
摘要:#include #include using namespace std; class Student { public: Student(char *pName = "no name", int ssId = 0) { id = ssId; strcpy(name,pName); cout<<"constructing new student "<<name<<endl... 阅读全文
posted @ 2010-10-12 21:48 Cranny 阅读(1324) 评论(0) 推荐(0) 编辑
摘要:#include #include using namespace std; class Student { public: Student(char *pName = "No name") { coutpNext; return; } for (Student *pS = pFirst; pS; pS = pS->pNext) { if (pS->pNex... 阅读全文
posted @ 2010-10-12 20:54 Cranny 阅读(255) 评论(0) 推荐(0) 编辑