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 <iostream>
# include <tr1/memory>
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<B> ptrB1(new B());
}
//输出:
construct A!!!
construct B!!!
destruct B!!!
destruct A!!!
14:在资源管理类中小心copying行为
- 复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。
- 普通而常见的RAII class copying 行为是:抑制copying(例如把它设置为私有)、施行引用计数法。不过其他行为也可能被实现。
15:在资源管理类中提供对原始数据的访问
- APIs往往要求访问原始资源,所以每一个资源应该提供一个“去的其所管理之资源”的方法。
- 对原始资源的访问可能经由显示转换或1隐式转换。一般而言显示转换比较安全,但隐式转换比较方便客户。
16:成对使用new 和delete时,采用相同形式。
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对象置入智能指针
- 以独立的语句将新建的对象存储于(置于)智能指针内。如果不这样做,一旦异常被抛出,有可能发生难以察觉的错误。
网友评论