我做新T [1]时会发生什么?

时间:2016-10-04 02:06:12

标签: c++ c++14 allocator

快速提问:

template <class T>
T* allocate(std::size_t n){
    return new T[n];
}

所以在上面的代码中,当n==1时,我们正在做new T[1],所以我有两个担忧:

1.我听说在分配数组时,额外的内存用于存储数组的长度(虽然不确定),所以当new T[1]很多时会浪费大量内存,这会是恶意的吗? / p>

2.我应该使用delete[]还是delete

来释放此内容

3 个答案:

答案 0 :(得分:3)

  1. 是的,在使用new T[n]时的典型实现中,需要一些额外的内存来存储数组的确切长度,但仅适用于具有非平凡析构函数的类型

    E.g。典型实现new int[1]new int相比没有内存开销,但与new std::string[1]相比,new std::string将带来内存开销。

    额外的内存只是一个额外的size_t字段,这意味着百分比取决于您分配的对象的大小。如果sizeof(T)sizeof(size_t)相当,则开销可能相当大。

    但这一切都可能还取决于特定于实现的内存分配机制的其他细节。

    换句话说,如果这是特定于应用程序的代码的一部分,那么尝试它并查看它是否对程序的内存消耗有任何负面影响是有意义的。也许这根本不是问题。但是如果你正在编写一个通用库,那么这样的事情值得关注。

  2. 是的,您应该使用delete []

答案 1 :(得分:2)

  1. RAM很便宜。确实,如果你的所有程序一直都是一次又一次地分配1个对象的数组,那么这将是一种浪费,这是真的。但偶尔分配一个单元素阵列并不会成为世界末日。

  2. 使用delete[]。如果您使用new[],那么您必须使用delete[]new编辑多少并不重要。这是一个相当严格的规则。没有例外。

答案 2 :(得分:0)

  1. 没有内存用于存储阵列的长度,或者至少没有内存可供访问。授予你内存的内存管理器可能有一些隐藏的簿记。你应该找到这本簿记,不管它。你用它做的任何东西肯定都是不便携的。您也可以使用固定大小的块提供内存。您将获得一个至少大小为T的块。这个块中的任何额外内存都被有效地浪费了。
  2. 使用new[]分配的任何内容都必须与delete[]一起发布,或者您调用未定义的行为。再一次,不要搞乱低级别的内存管理器。