reading 《effective c++》

第三章 资源管理

Item13 以对象管理资源

声明指针并delete操作的过程中,可能会由于之间的提前return等操作,导致指针的内存没有释放,将会在后续的程序中出现问题;解决方法:将返回的指针封装到指针类中:比如auto_ptr(该指针指向的资源必须有且只有一个auto_ptr指向它)与shared_ptr(可以允许多个shared_ptr同时指向同一块内存)中;将指针封装到指针对象中可以避免指针释放不及时,内存回收不及时的问题,指针类在函数结束时,右其类的析构函数释放内存。
该指针类在其析构函数中的释放内存操作为:delete而不是delete[]操作,则对于动态分配得到的数组array(std::string,std::vector)用这两个指针类时,不应该使用这些指针类.

Item14 在资源管理类中小心copying行为

1.复制资源管理类对象时应一并复制它所管理的资源,所以资源的copying行为决定资源管理类队形的copying行为;
2.常见的资源管理类的copying行为:一般抑制copying、实施引用计数法(reference counting)。不过其他行为也都可能被实现。

Item15在资源管理类提供对原始资源的访问

1.API往往要求访问的是原始资源(原始指针),而不是封装后的指针类,多以每个资源管理类应该提供一个“取得其所管资源的方法”。比如:auto_ptr与shared_ptr是通过.get()函数得到指针类中的原始指针。
2.一般而言,对原始资源的访问有显式访问与隐式访问,虽然隐式访问易用,但是显式访问更加安全。

Item16成对使用new与delete时,要采取相同的形式

当用户在new表达式中使用了[],在delete时也应该使用detele[];当用户在new中没有使用[],那么在delete中一定不要使用delete[]。

Item17 以独立语句将newed的对象存入智能指针

如果不这样做,一旦有异常抛出,有可能导致难以察觉的资源泄露。
比如:1、声明智能指针并分配内存:std::shared_ptr<widget> pw(new widget);
     2、函数调用:processWidget(pw,prority)。

第四章 设计与声明(Design and Declarations)

Item18 让接口容易被正确使用,不容易被误用

确保接口的一致性,并且与内置类型兼容;
tr1::shared_ptr支持定制型删除器(custom deleter),这可以防范DLL问题,可以用来自动解除互斥锁。

Item19 设计class犹如设计type:目的在于设计高效的class

1.对象的创建与销毁:构造函数、析构含税等;new 、delete;
2.对象的初始化与对象的赋值;
3.pass-by-value的实现:copy构造函数的实现方法;
4.合理的成员函数的构造;
5.函数之间的嵌套、取用的合理性(public、prootected、private的设计);

Item20:宁以pass-by-reference-to-const替换pass-by-value

一般而言:pass-by-value内存开销大而且耗时(需要多次调用构造函数与析构函数),一般建议使用以pass-by-reference-to-const。
特殊情况:传递对象为内置类型和STL的迭代器以及函数对象。

Item21:必须返回对象时,别妄想返回其reference

绝对不要返回指针或者引用指向一个local stack对象。

Item22:将成员变量声明为private

protected并没有比public具有更多的封装性

Item23:宁以non-member、non-friend替换member函数

为了确保成员的封装性

Item24:若所有的函数皆需要类型转换,请为此采用non-member函数

没有看懂

Item25:考虑写出一个不抛异常的swap函数

1.当std::swap的对自定义的类效率不高时,提供一个swap成员函数 ,并确定这个函数不抛出异常;
2.如果提供了一个member swap,也应该提供一个non-member swap来调用前者。对于class而言,应该特化std::swap;
3.调用swap时,应该针对std::swap使用using声明式,然后调用swap,不带任何命名空间资格修饰;
4.不要尝试在std内加入某些对std而言,全新的东西。

猜你喜欢

转载自blog.csdn.net/mixiaoxinmiss/article/details/78793472