标签:
以对象管理资源的观念常被称为“资源取得时机便是初始化时机”(RAII)
auto_ptr被销毁时会自动删除它所指之物,所以一定要注意别让多个auto_ptr同时指向同一对象,否则对象会被删除多次,行为未定义
auto_ptr有一个性质:若通过拷贝构造函数或拷贝构造运算符复制它们,它们会变成NULL,而复制所得的指针将取得资源的唯一拥有权
class Investment { private: double value; public: Investment(double val):value(val){} double getValue() { return value; } }; Investment* createInvestment(double val) { return new Investment(val); } int main() { auto_ptr<Investment> pInv1(createInvestment(3.0)); cout << pInv1->getValue() << endl; auto_ptr<Investment>pInv2(pInv1); cout << pInv1->getValue() << endl;//出错,pInv1为NULL }
可以用shared_ptr来代替auto_ptr,shared_ptr有一个缺点:无法打破环状引用,若两个其实已经没被使用的对象彼此互指,就好像还处在被使用的状态
auto_ptr和shared_ptr两者都在其析构函数内做delete而不是delete[]动作,所以在动态分配而得的array身上使用auto_ptr或shared_ptr是个馊主意
总结:
1.为防止资源泄露,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源
2.两个常被使用的RAII classes是shared_ptr和auto_ptr,前者是更好的选择(两者均用于管理heap上资源)
class Lock { public: explicit Lock(mutex* pm) :mutexPtr(pm) { mutexPtr->lock(); } ~Lock() { mutexPtr->unlock(); } private: mutex *mutexPtr; }; ---------------------------------------------------------------------------- //对底层资源采用引用计数 class Lock { public: explicit Lock(mutex* pm) :mutexPtr(pm,pm->unlock) { mutexPtr.get()->lock(); } private: tr1::shared_ptr<mutex> mutexPtr; };
shared_ptr允许指定删除器(deleter),这是一个函数或函数对象,当引用次数为0时便被调用(此机能并不存在于auto_ptr,它总是将指针删除)
标签:
原文地址:http://www.cnblogs.com/ljygoodgoodstudydaydayup/p/5719550.html