Effective C++ 第二版 5)new和delete形式 6) 析构函数里的delete
内存管理
1)正确得到: 正确调用内存分配和释放程序;
2)有效使用: 写特定版本的内存分配和释放程序;
C中用mallco分配的内存没有用free返回, 就会产生内存泄漏, C++中则是new和delete;
new和delete是隐式地调用构造和析构函数的, 而且可以在类内和类外自定义new和delete操作符, 这样带来了复杂性;
条款5 对应的new和delete要采用相同的形式
1
2
3
|
string *stringArray = new string[100];
//...
delete stringArray;
|
>stringArray指向的100个string对象中的99个不会被正确地摧毁, 析构函数不会被调用;
new会做两件事: 1) 内存被分配(operator new函数); 2) 为被分配的内存调用一个或多个构造函数;
delete也做两件事: 1) 为将被释放的内存调用一个或多个析构函数; 2) 释放内存(operator delete函数);
删除数组时要使用delete[]:
1
2
3
4
5
|
string *stringPtr1 = new string;
string *stringPtr2 = new string[100];
//...
delete stringPtr1; // 删除一个对象
delete [] stringPtr2; // 删除对象数组
|
在delete非数组时加 [], 结果是不可预测的, 在delete数组时没有 [], 结果也是不可预测; 对于int这样的固定类型, 没有析构函数, 但结果也是不可预测;
Note new对应delete, new[]对应delete[];
当一个类包含指针数据成员, 有多个构造函数时尤其注意, 在所有初始化指针成员的构造函数里采用相同的new的形式, 否则在析构函数中无法确定delet的形式;
Note 对typedef来说也需注意, 为避免混乱, 最好杜绝对数组类型使用typedef; 使用stl的string和vector模板替代;
1
2
3
4
5
|
typedef string AddressLines[4];
string *pal = new AddressLines;
// 注意"new AddressLines" 返回string*, 和 "new string[4]"返回的一样
delete pal; // 错误!
delete [] pal; // 正确
|
>AddressLines[]->vector<string>;
条款6 析构函数里对指针成员调用delete
大多数情况下, 动态内存分配的类在构造函数里用new分配内存, 在析构函数里用delete释放内存;
1) 每个构造函数里对指针进行初始化, 如果暂时没有内存分配给指针的话, 指针要被初始化为0(NULL, 空指针);
2) 删除现有的内存, 通过赋值操作符分配给指针新内存;
3) 析构函数里删除指针;
在构造和赋值操作过程中出现问题会比较明显, 但是在析构函数里没有正确删除指针, 可能只表现为一点微小的内存泄漏, 不断增长, 最后导致程序crash;
Note 删除空指针是安全的(等于什么都没做);
在写构造函数, 赋值操作符, 或其他成员函数时, 类的指针成员要指向有效的内存或者指向为空, 这样在析构函数中可以简单地delete, 不用检查指针是否new过;
Note 对于没有用new初始化的指针, 就像你永远不会去删除传递进来的指针 [异步的情况下, 可能需要接受外部传递指针的控制权, 在内部删除外部临时new的指针]
使用智能指针可以避免必须删除成员指针, 把成员指针用智能指针对象代替; e.g. stl中的auto_ptr;
Effective C++ 第二版 5)new和delete形式 6) 析构函数里的delete的更多相关文章
- Effective Java 第二版 Enum
/** * Effective Java 第二版 * 第30条:用enum代替int常量 */ import java.util.HashMap;import java.util.Map; publi ...
- Effective C++ 第二版 10) 写operator delete
条款10 写了operator new就要同时写operator delete 写operator new和operator delete是为了提高效率; default的operator new和o ...
- Effective C++ 第二版 8) 写operator new 和operator delete 9) 避免隐藏标准形式的new
条款8 写operator new 和operator delete 时要遵循常规 重写operator new时, 函数提供的行为要和系统缺省的operator new一致: 1)正确的返回值; 2 ...
- 《Effective Java第二版》总结
第1条:考虑用静态工厂方法代替构造器 通常我们会使用 构造方法 来实例化一个对象,例如: // 对象定义 public class Student{ // 姓名 private String name ...
- Effective C++ 第二版 17)operator=检查自己 18)接口完整 19)成员和友元函数
条款17 在operator=中检查给自己赋值的情况 1 2 3 class X { ... }; X a; a = a; // a 赋值给自己 >赋值给自己make no sense, 但 ...
- Effective C++ 第二版 40)分层 41)继承和模板 42)私有继承
条款40 通过分层来体现"有一个"或"用...来实现" 使某个类的对象成为另一个类的数据成员, 实现将一个类构筑在另一个类之上, 这个过程称为 分层Layeri ...
- Effective C++ 第二版 31)局部对象引用和函数内new的指针 32)推迟变量定义
条款31 千万不要返回局部对象的引用, 不要返回函数内部用new初始化的指针的引用 第一种情况: 返回局部对象的引用; 局部对象--仅仅是局部的, 在定义时创建, 在离开生命空间时被销毁; 所谓生命空 ...
- 《Effective Java 第二版》读书笔记
想成为更优秀,更高效程序员,请阅读此书.总计78个条目,每个对应一个规则. 第二章 创建和销毁对象 一,考虑用静态工厂方法代替构造器 二, 遇到多个构造器参数时要考虑用builder模式 /** * ...
- Effective C++ 第二版 1)const和inline 2)iostream
条款1 尽量用const和inline而不用#define >"尽量用编译器而不用预处理" Ex. #define ASPECT_R 1.653 编译器永远不会看到AS ...
随机推荐
- PS 色彩的色相谱
7- 色彩的色相谱 在这个环中,位于180度夹角的两种颜色(也就是圆的某条直径两端的颜色),称为反转色,又称为互补色.互补的两种颜色之间是此消彼长的关系,小框往蓝色移动的同时就会远离黄色, 黄色=白色 ...
- 如何写一个网页标题title的闪动提示
通过网页title来提示用户有新消息这个功能很常见,比如现在的微博,还有一些邮箱,这个功能都很常见.如何实现则个功能呢? 思路是:通过ajax访问后台,若有新消息,则将网页的title替换为 提示信息 ...
- css和js禁止网页选择文字
user-select有两个值: none:用户不能选择文本 text:用户可以选择文本 需要注意的是:user-select并不是一个W3C的CSS标准属性,浏览器支持的不完整,需要对每种浏览器进行 ...
- windows下配置lamp环境(5)---配置MySQL5.6
开始配置mysql 1.创建配置文件my.ini 1.进入C:\wamp\MySQL 2.把my-default.ini 另存一份:my.ini 3.开始编辑mysql的配置文件,打开my ...
- jQuery插件autoComplete使用
安装/需要引入的文件 <script type="text/javascript" src="../js/jquery-1.8.3.min.js.js"& ...
- Hibernate学习笔记--Hibernate框架错误集合及解决
错误1:MappingException: Unknown entity解决方案 http://jingyan.baidu.com/article/e75aca8552761b142edac6cf.h ...
- Linux_Shell符号及各种解释对照表
Shell符号及各种解释对照表: Shell符号 使用方法及说明 # 注释符号(Hashmark[Comments]) 1.在shell文件的行首,作为shebang标记,#!/bin/bash; 2 ...
- 关于取url或者微信中参数的js
今天遇到这么个情况,因为是第一次弄,所以在这里做了个记录,因为要弄过二维码的功能,要获取里面的参数并传给后台,所以要对二维码里面的地址进行过滤.刚开始是很惆怅的,因为之前没弄过,原以为可以通过spli ...
- 通过select选项动态异步加载内容
通过监听select的change事件来异步加载数据. 1:效果图: 选择Good: 选择 Bad: 2:index.html <!DOCTYPE html> <html lang= ...
- poj2068--Nim
题意:给你2n个人,两方各n个人,交叉坐,每个人可以取的石子有一个最大限制,总共有S颗石子,哪一方取了最后一颗石子就输了,问先取石子的这一方是否有必胜策略. DP,dp[i][j]代表第i个人还有J个 ...