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

  • 相关阅读:
    android canvas drawtext 字高
    ios修改UIIMage大小
    聊聊视频播放那些事2
    聊聊视频播放那些事1
    重入锁 ReentrantLock (转)(学习记录)
    setHasFixedSize(true)的意义 (转)
    ActivityLifecycleCallbacks
    NSSet
    阿里云ECS服务器IIS和WampServer同时运行
    ASP.NET MVC4网站部署在阿里ECS云服务器(WIndows Server 2012+IIS8环境)
  • 原文地址:https://www.cnblogs.com/lidan/p/2322962.html
Copyright © 2011-2022 走看看