「笔记」《Effective C++》 读书笔记(三)

注意!

这只是我的读书笔记,帮助我记录。其中可能有一些不严谨的解释或没有做很详细的解释,大家学习还是建议直接看书(虽然书中也有不严谨的解释)。

资源管理

条款 13:以对象管理资源

1
2
3
4
5
6
void f()
{
Investment* pInv = creteInvestment(); // 调用 factory 函数
...
delete pInv; // 释放 pInv 所指对象
}

... 可能存在过早的 return 语句,或抛出某些异常,delete 语句将不会被执行。类似的 goto 语句或循环中的 continuebreak

使用智能指针,利用栈中对象的析构函数自动对其 delete

1
2
3
4
5
6
void f()
{
std::auto_ptr<Investment> pInv(createInvestment());

...
}
  • 获得资源后立刻放进管理对象(managing object)
  • 管理对象(managing object)运用析构函数确保资源被释放

常使用的 RAII classes :tr1::shared_ptrauto_ptr

条款 14:在资源管理类中小心 copying 行为

1
2
3
4
5
6
7
8
9
10
11
12
13
class Lock{
public:
explicit Lock(Mutex* pm) : mutexPtr(pm)
{
lock(muterPtr);
}
~Lock()
{
unlock(mutexPtr);
}
private:
Mutex *mutexPtr;
}
1
2
3
4
Mutex m;

Lock ml1(&m);
Lock ml2(ml1);

RAII classes 应被禁止复制或采用“引用计数法(reference-count)”。

禁止复制

1
2
3
4
class Lock: private Uncopyable
{
...
}

“引用计数法”(reference-count)

1
2
3
4
5
6
7
8
9
class Lock{
public:
explicit Lock(Mutex* pm) : mutexPtr(pm, unlock)
{
lock(muterPtr.get());
}
private:
std::tr1::shared_ptr<Mutex> mutexPtr;
}
  • 进行“深度拷贝”,复制底部资源
  • 转移底部资源的拥有权,如:auto_ptr

Coping 函数包括 copy 构造函数和 copy assignment操作符。

条款 15:在资源管理类中提供对原始资源的访问

每个 RAII class 应该提供一个 “取得其所管理之资源” 的方法。
对原始资源的访问可能经由显式转换或隐式转换。显式转换比较安全,但隐式转换对客户比较方便。

条款 16:成对使用 new 和 delete 时要采取相同形式

使用 new 要严格搭配 delete,如使用 delete[] 为未定义的行为,可能多次调用析构函数。
使用 new[] 要严格搭配 delete[]
谨慎对数组类型 typedef

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

1
2
int priority();
void processWidget(std::tr1::shared_ptr<Widget>, priority());
1
2
3
4
5
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());
// 进入函数前做了以下三件事
// 执行 "new Widget"
// 调用 tr1::shared_ptr 构造函数
// 调用 priority()

编译器对这三件事的完成次序上弹性很大。
如在 priority() 抛出了异常,new Widget 返回的指针将可能遗失,因为它尚未被置入 std::tr1::shared_ptr 内。

避免这类问题只需分离语句,控制执行顺序。

1
2
std::tr1::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority);

本文标题:「笔记」《Effective C++》 读书笔记(三)

文章作者:赵砚潇

发布时间:2018年12月19日 - 00:12

最后更新:2019年05月10日 - 19:05

原始链接:https://blog.zyx.sh/2018/12/19/effective-cpp03/

许可协议: 署名-非商业性使用-相同方式分享 4.0 国际 转载请保留原文链接及作者。

Donate comment here