zoukankan      html  css  js  c++  java
  • effective C++ 条款 16:成对使用new和delete时要采用相同形式

    当你使用new,有两件事情发生。

    第一,内存被分配出来(通过名为operator new的函数)。

    第二,针对此内存会有一个(或多个)构造函数被调用。当你使用delete,也有两件事情发生:针对此内存会有一个或多个析构函数被调用,然后内存被释放。

    数组所用的内存通常还包括”数组大小”的记录,以便delete知道调用多少次析构函数。

    当你调用new时使用[],你必须在对应调用delete时也使用[]。如果你在调用new时没使用[],那么也不该在对应调用delete时使用[]。

    当你撰写的class含有一个指针指向的动态内存分配,并提供多个构造函数时,你必须小心的在所有构造函数中使用相同形式的

    new将指针成员初始化。否则,不知道该在析构函数中使用什么形式的delete。因为析构函数只有一个。

    这个规则对于稀罕使用typedef的人也很重要:

    typedef std::string AddressLines[4];

    由于AddressLines是个数组,如果这样使用new:

    std::string* pal = new AddressLines; //注意,“new AddressLines”返回一个string*,就像“new string[4]”一样

    那必须匹配数组形式的delete:

    delete pal; //行为未定义

    delete [] pal; //很好。

    为避免此类错误,最好不要对数组形式做typedef动作,真很容易达成,因为C++标准库含有string,vector等templates,可将数组的需求降至几乎为0。可将本例的AddressLines定义为vector<string>。

  • 相关阅读:
    Beyond Compare同步功能简介
    CorelDRAW中如何制作表格
    如何解决CorelDRAW中尖突问题
    LCS 最长公共子序列
    Java容器部分用法
    数论知识简易总结
    操作系统的运行环境 中断与有异常
    OS的发展和分类
    操作系统的基本概念
    搭建神经网络的八股
  • 原文地址:https://www.cnblogs.com/lidan/p/2322962.html
Copyright © 2011-2022 走看看