effectiveC++

条款1:尽量用const和inline而不用#define
条款3:尽量用new和delete而不用malloc和free
malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。

条款6:析构函数里对指针成员调用delete

执行动态内存分配的的类都在构造函数里用new分配内存,然后在析构函数里用delete释放内存
删除空指针是安全的(因为它什么也没做)。所以,在写构造函数,赋值操作符,或其他成员函数时,类的每个指针成员要么指向有效的内存,要么就指向空,那在你的析构函数里你就可以只用简单地delete掉他们,而不用担心他们是不是被new过。

条款7:预先准备好内存不够的情况(重点)

条款8: 写operator new和operator delete时要遵循常规

自己重写operator new时(条款10解释了为什么有时要重写它),很重要的一点是函数提供的行为要和系统缺省的operator new一致。实际做起来也就是:
要有正确的返回值;分配请求成功,就返回指向内存的指针;如果失败,则遵循条款7的规定抛出一个std::bad_alloc类型的异常
可用内存不够时要调用出错处理函数(见条款7);
处理好0字节内存请求的情况(把它作为请求一个字节来处理)
避免不小心隐藏了标准形式的new,不过这是条款9的话题。
由于存在继承,基类中的operator new可能会被调用去为一个子类对象分配内存:
把这个“错误”数量的内存分配请求转给标准operator new来处理,象下面这样:

void * base::operator new(size_t size)
{
  if (size != sizeof(base))             // 如果数量“错误”,让标准operator new
    return ::operator new(size);        // 去处理这个请求
                                        // 

  ...                                   // 否则处理这个请求
}

假设类的operator new将“错误”大小的分配请求转给::operator new,那么也必须将“错误”大小的删除请求转给::operator delete:

class base {                       // 和前面一样,只是这里声明了
public:                            // operator delete
  static void * operator new(size_t size);
  static void operator delete(void *rawmemory, size_t size);
  ...
};

void base::operator delete(void *rawmemory, size_t size)
{
  if (rawmemory == 0) return;      // 检查空指针

  if (size != sizeof(base)) {      // 如果size"错误",
    ::operator delete(rawmemory);  // 让标准operator来处理请求
    return;                        
  }

  释放指向rawmemory的内存;

  return;
}

条款9: 避免隐藏标准形式的new

因为内部范围声明的名称会隐藏掉外部范围的相同的名称,所以对于分别在类的内部和全局声明的两个相同名字的函数f来说,类的成员函数会隐藏掉全局函数:

条款10: 如果写了operator new就要同时写operator delete

内存分配器(重点)
条款12: 尽量使用初始化而不要在构造函数里赋值
条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
条款15: 让operator=返回*this的引用

条款16: 在operator=中对所有数据成员赋值

派生类的赋值运算符也必须处理它的基类成员的赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值