Effective|Effective C++ Chapter3-资源管理
13:以对象管理资源 Use object to manager resources
- 将资源放进对象内,当控制流离开,该对象会析构函数自动释放那些资源;把资源放进对象内,我们可以依赖C++的析构函数自动调用机制确保资源被释放。
- RAII “资源获得时机便是初始化时机” “Resource Acquisition Is Initializaton”
- 例如 可以降资源仿如智能指针 auto_ptr 或 tr1::shared_ptr
- shared_ptr采用引用计数,多个指针可以指向同一个对象;auto_ptr就不能,只能运行一个指针指向一个对象:如果要指针赋值,那么原来的指针要放弃对该对象的所有权。
- shared_ptr在最新的c++11中,已经被列入了标准指针,而auto_ptr则出局了。
shared_ptr采用RAII技术,是防止内存泄露的神器。
# include
# include
using namespace std;
class A {
public:
A() {
cout << "construct A!!!" << endl;
}
;
~A() {
cout << "destruct A!!!" << endl;
}
;
};
class B: public A {
public:
B() {
cout << "construct B!!!" << endl;
}
;
~B() {
cout << "destruct B!!!" << endl;
}
;
};
int main() {
//B* ptrB0 = new B();
std::tr1::shared_ptr ptrB1(new B());
}
//输出:
construct A!!!
construct B!!!
destruct B!!!
destruct A!!!
14:在资源管理类中小心copying行为
- 复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。
- 普通而常见的RAII class copying 行为是:抑制copying(例如把它设置为私有)、施行引用计数法。不过其他行为也可能被实现。
- APIs往往要求访问原始资源,所以每一个资源应该提供一个“去的其所管理之资源”的方法。
- 对原始资源的访问可能经由显示转换或1隐式转换。一般而言显示转换比较安全,但隐式转换比较方便客户。
std::string* stringPtr1 = new std::string;
std::string* stringPtr2 = new std::string[100];
delete stringPtr1;
//删除一个对象
delete stringPtr2[ ];
//删除一个由对象组成的数组
typedef std::string AddressLines[4]//尽量不要这样用
std::string* pal = new AddressLines;
//返回一个string* , 就像“new AddressLines[4]”一个
//上面就必须使用一个数组形式的delete[ ]
17:已独立的语句将newed对象置入智能指针
- 以独立的语句将新建的对象存储于(置于)智能指针内。如果不这样做,一旦异常被抛出,有可能发生难以察觉的错误。
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- opencv|opencv C++模板匹配的简单实现
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- c++基础概念笔记
- 牛逼!C++开发的穿越丛林真人游戏,游戏未上线就有百万人气
- C++Primer之|C++Primer之 函数探幽
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- QML基础信息
- C++-类型转换
- MongoDB|MongoDB - 简介