• 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>。

  • 相关阅读:
    结合grabcut和inpaint,实现人像去除
    配置zbar识别二维码()
    自己动手,实现“你的名字”滤镜
    prometheus监控进程
    xen vhdutil 工具检查找到依赖父子关系
    如何选择最合适的DNS
    dockercompose一直创建中
    centos7/8添加附加ip,添加子集ip
    Prometheus系统下vmware_exporter配置
    docker的监控cAdvisor
  • 原文地址:https://www.cnblogs.com/lidan/p/2322962.html
Copyright © 2020-2023  润新知