WordPress新版文章,淘宝seo排名优化的方法,关于建设网站的申请报告,wordpress新浪云平台Effective C中文版学习记录#xff08;三#xff09;
章节三#xff1a;资源管理
进度#xff1a;17/55 文章目录 Effective C中文版学习记录#xff08;三#xff09;条款13、以对象管理资源条款14、在资源管理类中小心copying行为条款15、在资源管理类中提供对原始资…Effective C中文版学习记录三
章节三资源管理
进度17/55 文章目录 Effective C中文版学习记录三条款13、以对象管理资源条款14、在资源管理类中小心copying行为条款15、在资源管理类中提供对原始资源的访问条款16、成对使用new和delete时要采取相同形式条款17、以独立语句将newed对象置入智能指针 条款13、以对象管理资源
考虑的是如果自己写指针有以下情况
void f
{someClass * p someClass();...delete p;
}看起来很合理吧申请资源离开作用域时释放资源防止内存泄漏
但是假设这个代码需要进行迭代多人合作导致在…处出现了过早的return
那么p就不会被释放造成内存泄漏
所以更合适的方式是都写进对象中在离开作用域时让对象自己调用析构函数
或者使用shared_ptr和auto_ptr等等
PS.这里引入了C中的一个概念即RAII
条款14、在资源管理类中小心copying行为
资源管理类即条款13引入的RAII类指的是资源在构造期间获得在析构期间释放
这种RAII类的拷贝需要将它管理的资源一起拷贝或者使用计数器即shared_ptr等等
讲人话就是不要只是复制指针要一起复制资源防止原本的类被释放了拷贝的指针就会受影响
即
int * p1;
int * p2;
p2 p1;
delete p1;这种情况再使用p2就有问题了
条款15、在资源管理类中提供对原始资源的访问
简单而言就是前文中描述RAII类能够自动管理这些资源但是我们有时候需要直接使用这些资源而不是通过RAII类
那么就需要RAII类来提供一个函数能够直接返回这些资源这个实现方法要看具体RAII类的设计方式
也就是类似于shared_ptr中的get函数而返回资源可能需要经过一些转换显式转换或隐式转换
尽量使用显式转换因为比较安全
条款16、成对使用new和delete时要采取相同形式
举例
std::string * str new std::string[100];
...
delete str;这样是不对的因为这样可能只是删除了string[0]这个部分剩下的元素都没删除
正确做法应该是
delete [] str;这样才能将完整的队列释放
条款17、以独立语句将newed对象置入智能指针
考虑这样一个情况
int num();
void test(shared_ptrint element, int num);
...
test(shared_ptrint(new int), num());这里test接收两个元素一个是shared_ptr指针另一个是num()函数而我们用一行处理可能会发生错误
如果这里num()函数调用错误会导致shared_ptr指针里面new的元素丢失掉无法释放造成内存泄漏
所以应该拆开来写即
shared_ptrint element(new int);
test(element, num());也就是实现了独立语句创建智能指针这样即便是num()函数崩了element也还在一样可以正常析构释放