effctive C++ 读书笔记 条款 16

条款16 成对使用new和delete时要采取相同形式

#include <iostream>
#include <string>
using namespace std;

/*

条款16:成对使用new 和 delete时要采取相同形式

  如果你在new表达式中使用[],必须在相应的delete表达式中也使用[],如果在new当中没有使用[],那么delete中也
  不能使用[],两者是成对出现的。

*/
int main()
{

	//第一版 : 报错
	/*
	string * p_str = new string[1000];
	delete p_str;
	*/
/*
当我们使用delete的时候,要考虑即将被删除的指针,所指的是单一对象还是对象数组;数组所用的内存通常还包括“数组大小”的记录
以便delete知道需要调用多少次析构函数,而单一对象的内存则没有这笔记录
*/
	//第二版  可以通过
	string * p_str = new string[1000];
	delete []p_str;

	//第三版:报错,因为这样,delete会读取若干内存并将它解释为“数组大小”,然后开始调用多次析构函数,浑然不知它所处理的那块内存不但不是个数组,而且还不是它想要的对象类型
	/*
	string *p_str2 = new string;
	delete []p_str2;
	*/

	//第四版  可以通过
	string *p_str2 = new string;
	delete p_str2;

	//第五版:报错,因为使用typedef后,这里一个string* 就是相当于new string[4]一样
	/*
	typedef string AddressLines[4]; //每个人的地址有4行,每行是一个string
	string* p1 = new AddressLines;
	delete p1;
	*/

	//第六版 通过
	typedef string AddressLines[4]; //每个人的地址有4行,每行是一个string
	string* p1 = new AddressLines;
	delete []p1;

	return 0;
}
时间: 2024-11-05 21:48:34

effctive C++ 读书笔记 条款 16的相关文章

算法导论读书笔记(16)

算法导论读书笔记(16) 目录 动态顺序统计 检索具有给定排序的元素 确定一个元素的秩 区间树 步骤1:基础数据结构 步骤2:附加信息 步骤3:维护信息 步骤4:设计新操作 动态顺序统计 之前介绍过 顺序统计 的概念.在一个无序的集合中,任意的顺序统计量都可以在 O ( n )时间内找到.而这里我们将介绍如何在 O ( lg n )时间内确定任意的顺序统计量. 下图显示的是一种支持快速顺序统计量操作的数据结构.一棵 顺序统计树 T 通过在红黑树的每个结点中存入附加信息而成.在一个结点 x 内,增

effective C++ 读书笔记 条款06

条款06:若不想使用编译器自动生成的函数,就该明确拒绝: 直接看代码与注释: #include <iostream> using namespace std; class Test { public: Test() { } ~Test() { } /* void TT() { Test t1; Test t2(t1); } */ private: Test(const Test& test); Test& operator = (const Test& test); }

Effective C++读书笔记(条款11-17)

继续上一篇... (二).构造/析构/赋值运算 ____________________________________________________________________________________________________________________________________ 条款11:在operator= 中处理 "自我赋值" #1.确保当对象自我赋值时 operator=有良好行为.其中包括"自我赋值安全性"和 "异

《C#本质论》读书笔记(16)构建自定义集合

16.1 更多集合接口 16.1.1 IList<T>与IDictionary<TKey,TValue> 16.1.2 ICollection<T> 16.2 主要集合类 16.2.1 列表集合:List<T> 16.2.2 全序 16.2.3 搜索List<T> 16.2.4 字典集合:Dictonary<TKey,TValue> 16.2.5 已排序集合:SortedDictionary<TKey,TValue>和So

effective C++ 读书笔记 条款11

条款11: 在operator= 中处理"自我赋值" 在实现operator=时考虑自我赋值是必要的就像 x=y .我们不知道变量x与y代表的值是否为同一个值(把x和y说成是一个指针更恰当一点). 例如以下 第一版: #include <iostream> using namespace std; class bitmap { public: bitmap() { cout<<"调用bitmap()无參构造函数"<<endl; }

effective C++ 读书笔记 条款08

条款08  别让异常逃离析构函数: 假设在析构函数其中发生了异常,程序可能会过早结束或者导致不明白行为(异常从析构函数传播出去) 看代码: #include <iostream> using namespace std; class DBConnection { public: void close() { int i = 3; int j = 0; int k = i/j; printf("%d\n",k); } }; class DBConn { public: DBC

Effective C++读书笔记(条款18-23)

(四).设计与声明 ____________________________________________________________________________________________________________________________________ 条款18:让接口容易被使用,而不容易被误用 #1.导入新类型可以让接口不易被误用,以函数替换对象则可以保证类型安全性. 例如: class Date{ public: Date(int month, int day

effective C++ 读书笔记 条款12与条款13

条款12:确定你的public继承塑膜出is-a关系: 这个条款主要将了一些特殊情况:比如企鹅是鸟,企鹅可以继承于鸟,但是鸟会飞,企鹅却不能飞:还有让正方形继承矩形可能也会造成这种尴尬! 这个问题以前想过,但是不知道怎么解决,如果现实生活当中确实要这么使用:比如 猫 狗 鱼  猪等等许多动物继承Animal类,但是猫狗等不会游泳, 假如这里是有很多动物,不能采用鱼里面专门加一个方法!  这个现在还没想出来,条款12也没有讲如果要这么用该怎么处理就是将要避免这样. is - a; 在面向对象程序设

effective C++ 读书笔记 条款10

条款10:  令operator= 返回一个reference to *this; 关于赋值,我们可以这样写: int  x,y,x; x =y = z; 这就是所谓的连续赋值 为了实现"连锁赋值"赋值操作符必须返回一个reference指向操作符的左侧实参.这是我们为class实现赋值操作符时应该遵循的协议: #include <iostream> using namespace std; class Widget { public: Widget() { cout<