Effective C++学习笔记(第三章)

2022-04-10  本文已影响0人  crazyhank
条款13:以对象管理资源
class A {
public:
  int val;
};
// 这里返回A实例的智能指针,就能有效防止内存资源泄露
std::shared_ptr<A> CreateA()
{
  return std::make_shared<A>();
}
条款14:在资源管理类中小心copying行为
class A {
public:
        A() {std::cout << "construct" << std::endl;}
        A(const A& rhs) = delete;  // 禁止拷贝构造
        A(A&& rhs) = delete;  // 禁止移动构造
        A& operator = (const A& rhs) = delete;  // 禁止赋值运算
};
条款15:在资源管理类中提供对原始资源的访问
条款16:new和delete采用相同的形式

这条规则很简单也很直接,即new内存资源的时候使用了[],则delete的时候也要使用[],如下:

char* p = new char[100];
...
delete [] p;
条款17:以独立语句将newed资源置于智能指针

之所以这样做,主要是为了防止不易察觉的内存泄露,考察如下情况:

class A {
};

Process(std::shared_ptr<A>(new A), SubProcess());

Process函数中第一个参数是A类型的智能指针,第二个参数是调用SubProcess函数获取的另外一个对象。这个过程中包含了三个操作:
(1)申请A资源
(2)构造shared_ptr<A>对象
(3)调用SubProcess函数

由于编译器不一定严格按照上述的流程来执行,它可能先执行(3)再执行(2),这个时候如果在执行(3)的时候发生了异常,则(1)操作产生的A资源将会产生泄露,因为还没有将A类型指针装进智能指针对象。

解决的方法:

class A {
};
auto sp = std::shared_ptr<A>(new A);
Process(sp, SubProcess());
上一篇 下一篇

猜你喜欢

热点阅读