malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数. 假设用两种方法给一个包含10个string对象的数组分配空间,一个用malloc,另一个用new: string *stringarray1 = static_cast<string*>(malloc(10 * sizeof(string))); string *stringarray2 = new string[10]; 其结果是,stringarray1确实指向的是可以容纳10个string对…
new和delete最终调用malloc和free,关于malloc和free实现原理参见这篇文章: http://blog.csdn.net/passion_wu128/article/details/38964045 new new操作针对数据类型的处理,分为两种情况: 1,简单数据类型(包括基本数据类型和不需要构造函数的类型) 代码实例: int* p = new int; 汇编码如下: int* p = new int; 00E54C44  push        4 00E54C46 …
(一) 为什么有人想要替换operator new 和 operator delete呢?三个常见的理由: (1)用来检測运用上的错误. (2)为了强化效果. (3)为了收集使用上的统计数据. (二) 以下是个高速发展得出的初阶段global operator new.促进并协助检測"overruns"或"underruns". static const int signature = 0xDEADBEEF; typedef unsigned char Byte;…
private继承的意义在于“be implemented in turns of”,这个与上一条款中说的复合模型的第二层含义是相同的,这也意味着通常我们可以在这两种设计方法之间转换,但书上还是更提倡使用复合来进行类的设计. private继承与public的继承是完全不同的,主要体现在两个地方: 其一,public继承在子类中保持父类的访问权限,即父类中是public的成员函数或成员变量,在子类中仍是public,对private或者protected的成员函数或成员变量亦是如此:但priva…
先看下面的例子: enum MyColor { RED, GREEN, BLUE, }; class Shape { public: ; }; class Rectangle: public Shape { public: void Draw(MyColor color = GREEN) const { cout << "default color = " << color << endl; } }; class Triangle : public…
这个条款书上内容说的篇幅比较多,但其实思想并不复杂.只要能理解三句话即可,第一句话是:纯虚函数只继承接口:第二句话是:虚函数既继承接口,也提供了一份默认实现:第三句话是:普通函数既继承接口,也强制继承实现.这里假定讨论的成员函数都是public的. 这里回顾一下这三类函数,如下: class BaseClass { public: ; // 纯虚函数 void virtual ImpureVirtualFunction(); // 虚函数 void CommonFunciton(); // 普通…
这一条款是说的是公有继承的逻辑,如果使用继承,而且继承是公有继承的话,一定要确保子类是一种父类(is-a关系).这种逻辑可能与生活中的常理不相符,比如企鹅是生蛋的,所有企鹅是鸟类的一种,直观来看,我们可以用公有继承描述: class Bird { public: virtual void fly(){cout << "it can fly." << endl;} }; class Penguin: public Bird { // fly()被继承过来了,可以覆…
operator new 应该内含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用new-handler.它也应该有能力处理0 bytes 申请.Class专属版本则还应该处理“比正确大小更大的(错误)申请”. operator delete 应该在收到null指针时不做任何事.Class 专属版本则还应该处理“比正确大小更大的(错误)申请”.…
有许多理由需要写个自定的new 和delete ,包括改善效能.对heap 运用错误进行调试.收集heap 使用信息.…
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个条款或许改为“宁可以编译器替换预处理器”比较好,因为或许#define不被视为语言的一部分,那正是它的问题所在.#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本.#define的基本用法有两种,都容易出现问题,C++也分别采用不同的方法进行解决. 1. 简单的宏定义 1.1 核心…