Effective C++学习笔记-内存管理

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

这样做是为了效率,也就是当一个类的size很小的时候,如果需要频繁的new和delete对象,也即大量的分配释放小的内存块,这样不仅会造成系统内存碎片,性能也会很差。这个时候我们可以在new第一个对象的时候分配一个很大的Pool资源池,这样在接下来频繁的new这个对象时,就从这个资源池里分内存就行而不是调用::operator new,而delete对象时则将内存放回到Pool中,而非调用::operator delete。

条款11:为需要动态分配内存的类声明一个拷贝构造函数和一个肤质操作符

char* data的浅拷贝和深拷贝

条款12:尽量使用初始化而不是在构造函数中赋值

同样是为了效率,减少没必要的赋值操作。注意const类型和引用类型的数据成员只能用初始化。

条款13:初始化列表中成员勒出的顺序和他们在类中声明的顺序相同

类成员是按照他们在类里呗声明的顺序进行初始化的,和他们在成员初始化列表中的列出的顺序没一点关系。

条款14:确定基类有虚析构函数

当通过积累的指针去删除派生类的对象,而基类有没有虚析构函数时,结果将是不可确定的。如果无故的声明虚函数(这个虚函数将不可能成为父类)时,需要考虑这个虚函数将会增加一个额外的指针,也就类的sizeof()大小问题。当且仅当类里包含至少一个虚函数的时候才去声明徐析构函数,这个说法也是不靠谱的。

条款15:让operator=返回*this的应用

如果operator=返回void会影响连续赋值。 对于C& oprator=(const C&);考虑到参数是const或者在函数中产生的临时对象为const,这样返回是非法的。即如果不这样做,就会导致不能连续赋值,或导致调用时的隐式类型转换不能进行。

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

这里要要说的是包括对基类各个成员的赋值,如果基类自己实现了operator=则要在子类的operator=()中调用Base::operator=()给父类也重新赋值,如果基类的赋值运算符是编译器生成的,则可将子类强制转换成父类,再赋值,即static_cast<Base&>(*this) = rhs;同样的道理,在拷贝构造函数里面也要执行基类的拷贝构造函数。

条款17:在operator=中要考虑给自己赋值的情况

有些对象需要分别判断其成员变量(如指针或指针指向的数据)是否相等,而有些只需判断对象是否是同一个引用即可,这些都得在根据实际的需求来写operator=()。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值