Effective C++之条款17、18

条款17:以独立语句将newed对象置入智能指针

    假设我们有个函数用来揭示处理程序的优先权,另一个函数用来在某动态分配所得的Widget上进行某些带有优先权的处理:

int priority();
void processWidget(shared_ptr<Widget> pw, int priority());

    现在考虑调用processWidget。

processWidget(shared_ptr<Widget>(new Widget), priority());

    虽然我们在此使用“对象管理式资源”,上述1调用却可能泄露资源。编译器在调用processWidget之前,必须创建代码,做一下动作:

  • 执行“new Widget”
  • 调用priority
  • 调用shared_ptr构造函数
         现在如果调用priority时发生异常,“new Widget”返回的指针将会遗失,因为它尚未被置入shared_ptr内。避免这类问题的办法很简单:使用分离语句,分别写出(1)创建Widget,(2)将它置入一个智能指针内,然后再把那个智能指针传给processWidget:
shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());   //此时不再造成泄露


条款18:让接口容易被正确使用,不易被误用

    假设你为一个用来表现日期的class设计构造函数:

class Date {
public:
	Date(int month, int day, int year);
	...
};

    上述代码存在的问题在于,客户在使用函数时可能会搞错参数,比如在本该输入年份的位置输入了月份,出现了像2月30号这样的日期等情况。许多客户端错误可以通过导入新类型而获得预防:

struct Day {
	explicit Day(int d): val(d){}
	int val;
};
struct month {...};
struct year {...};
Date d(30, 3, 1999);                    //错误,不正确的类型
Date d(Day(30), Month(30), year(1999)); //错误,不正确的类型
Date d(Month(30), Day(30), year(1999)); //类型正确

请记住

  • “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容。
  • “组织误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
  • shared_ptr支持定制型的删除器。这可防范DLL问题,可被用来自动解除互斥锁(见条款14)等等。
发布了33 篇原创文章 · 获赞 6 · 访问量 572

猜你喜欢

转载自blog.csdn.net/weixin_43519984/article/details/102549685