【问题标题】:What is difference between new and new[1]?new 和 new[1] 有什么区别?
【发布时间】:2011-11-22 13:28:03
【问题描述】:

newnew[1] 有什么区别?我可以将deletenew[1] 一起使用吗?

编辑

好吧好吧,我应该提供背景,抱歉。我正在使用 VS 2010 评估 BoundsChecker,当我在 new[1] 上使用 delete[] 时,它抱怨内存泄漏。所以理论上我知道应该如何使用 new 和 delete 对,但是这种特殊情况让我对引擎盖下的事情感到困惑。知道发生了什么吗?

【问题讨论】:

    标签: c++ dynamic-allocation new-operator


    【解决方案1】:

    Ed 和 aix 是对的,但背后还有很多事情要做。

    如果你使用new,然后delete,delete调用会执行一个析构函数。

    如果使用new[],就必须使用delete[],但是delete[]怎么知道调用了多少析构函数呢?可能有 2 个实例的数组,还是 2000 个实例中的一个? 一些(可能是大多数或全部)编译器所做的是,在它返回给您的内存之前存储实例的数量。

    所以如果你调用 new[5],那么 new 会像这样分配内存:

    +---+-----------+-----------+-----------+-----------+-----------+
    | 5 | instance1 | instance2 | instance3 | instance4 | instance5 |
    +---+-----------+-----------+-----------+-----------+-----------+
    

    你会得到一个指向 instance1 的指针。

    如果您稍后调用 delete[],delete[] 将使用数字(在本例中为 5)查看在释放内存之前需要调用多少个析构函数。

    请注意,如果您将 new 与 delete[] 或 new[] 与 delete 混合使用,则可能会出现严重错误,因为数字可能丢失,或者数字可能不正确。

    如果将 new[1] 与 delete 混合使用,你可能只是幸运,但不要依赖它。

    【讨论】:

      【解决方案2】:

      new 创建一个实例,而new[1] 创建一个单元素数组。与new 相比,new[1] 几乎肯定会产生(小)内存开销来存储数组的大小。 new[] 不能使用非默认构造函数。

      new 必须与delete 一起使用。

      new[] 必须与delete[] 一起使用。

      【讨论】:

      • +1 提到在使用 new[] 时必须有一个默认构造函数。这经常被忽视。
      • 另一方面,在大多数系统上,对于具有微不足道的析构函数的类型,内存开销没有差异(但允许差异)。
      【解决方案3】:

      new[] 是分配和初始化对象数组并返回指向第一个元素的指针的运算符。这与 new 运算符不同,new 运算符具有相同的行为,但只针对一个分配,而不是数组。对于释放和对象销毁,new 应与 delete 一起使用,new[] 应与 delete[] 一起使用。

      // operator new[] and new example
      
      // create array of 5 integers
      int * p1 = new int[5];
      delete[] p1;
      
      // regular allocation of one int
      int * p1 = new int;
      delete p1;
      

      (详情请参阅here

      【讨论】:

        【解决方案4】:

        'new[1]' 创建一个包含一项的数组。需要使用delete[] 来释放内存。 new 只是创建一个对象。使用delete

        【讨论】:

          猜你喜欢
          • 2018-08-02
          • 1970-01-01
          • 1970-01-01
          • 2018-06-04
          • 2012-12-29
          • 2017-10-31
          • 2011-04-23
          • 2014-02-10
          • 1970-01-01
          相关资源
          最近更新 更多