《Effect C++》学习------条款16:成对使用new和delete时要采取相同形式
2016-09-18 19:30
351 查看
当使用new时(即通过new动态生成一个对象),有两件事发生:第一,内存被分配出来(通过名为operator new 的函数);第二,针对此内存会有一个(或更多)构造函数被调用。
当使用delete时,也有两件事发生:针对此内存会有一个(或更多)析构函数被调用,然后内存才被释放(通过名为operator delete 的函数)。delete的最大问题在于:即将被删除的内存之内有究竟存有多少对象?(即将被删除的那个指针,所指的是单一对象或对象数组?)此问题的答案决定了又多少个析构函数必须被调用起来。
单一对象的内存布局不同于对象数组的内存布局:数组所用的内存包括“数组大小”记录,以便delete制定需要调用多少次析构函数。单一对象的内存则没有这笔记录。
delete[]认定指针指向一个数组,多次调用析构函数。因此切记 new和delete时要采取相同形式。
如果对strPtr1使用delete[]形式:delete会读取若干内存并解释为“数组大小”,然后多次调用析构函数。
如果对strPtr2没使用delete[]形式:可能导致99个析构函数没被调用,对象不太可能被适当删除。
也就是说,以上的两种情况都可能会导致不确定的行为哟~
对于typedef动作,当以new创建该种typedef类型对象时,应该说清楚应该以哪一种delete形式删除。
考虑下面这个例子:
那就必须匹配“数组形式”的delete[]:
请牢记:
[x] 如果在new表达式中使用[],必须在相应的delete表达式中也使用[]。 new[] 对应 delete[] 如果在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。 new 对应 delete
当使用delete时,也有两件事发生:针对此内存会有一个(或更多)析构函数被调用,然后内存才被释放(通过名为operator delete 的函数)。delete的最大问题在于:即将被删除的内存之内有究竟存有多少对象?(即将被删除的那个指针,所指的是单一对象或对象数组?)此问题的答案决定了又多少个析构函数必须被调用起来。
单一对象的内存布局不同于对象数组的内存布局:数组所用的内存包括“数组大小”记录,以便delete制定需要调用多少次析构函数。单一对象的内存则没有这笔记录。
delete[]认定指针指向一个数组,多次调用析构函数。因此切记 new和delete时要采取相同形式。
std::string* strPtr1 = new std::string; std::string* strPtr2 = new std::string[100]; ... delete strPtr1; //删除一个对象 delete [] strPtr2; //删除一个由对象组成的数组
如果对strPtr1使用delete[]形式:delete会读取若干内存并解释为“数组大小”,然后多次调用析构函数。
如果对strPtr2没使用delete[]形式:可能导致99个析构函数没被调用,对象不太可能被适当删除。
也就是说,以上的两种情况都可能会导致不确定的行为哟~
对于typedef动作,当以new创建该种typedef类型对象时,应该说清楚应该以哪一种delete形式删除。
考虑下面这个例子:
typedef std::string AddressLines[4];//每个人的地址有4行 每行是一个string<br><br>//AddressLines是个数组,如果这样使用new: <br>std::string* pal = new AddressLines;//返回一个string* 跟new string[4]一样
那就必须匹配“数组形式”的delete[]:
delete pal; //行为未有定义!!! delete [] pal; //OK
请牢记:
[x] 如果在new表达式中使用[],必须在相应的delete表达式中也使用[]。 new[] 对应 delete[] 如果在new表达式中不使用[],一定不要在相应的delete表达式中使用[]。 new 对应 delete
相关文章推荐
- Effective c++ 条款16学习笔记: 成对使用new和delete时要采取相同形式
- 《Effective C++》学习笔记条款16 成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete的时候要采取相同形式
- Effective C++:条款16:成对使用new和delete时要采取相同形式
- 条款16:成对使用new以及delete的时候应该采取相同的形式
- 条款16 成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete时要采取相同形式
- Effective C++ 条款15、16 在资源管理类中提供对原始资源的访问||成对使用new 与 delete要采取相同形式
- 读书笔记《Effective C++》条款16:成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete时要采取相同形式
- Effective C++条款16:成对使用new和delete时要采取相同形式
- 条款16 成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete时要采取相同的形式
- Effective C++ -----条款16:成对使用new和delete时要采取相同形式
- Effective C++ 条款16 成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete时要采取相同形式
- 条款16:成对使用new和delete时要采取相同的形式
- 条款16:成对使用new和delete时,采取相同的形式