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

What's happening when I do new T[1]?

本文关键字:什么      更新时间:2023-10-16

快速提问:

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

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

1。我听说在分配数组时,额外的内存用于存储数组的长度(不确定),所以当有new T[1]很多时,这会是恶意的,浪费了很多内存?

2。我应该使用delete[]还是简单地使用delete来释放它?

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

    。在一个典型的实现中,new int[1]new int相比没有内存开销,但new std::string[1]new std::string相比会有内存开销。

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

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

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

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

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

  2. 使用delete[]。如果您使用new[],那么您必须使用delete[]。不管new是多少,这是一个反复尝试的规则。没有例外。

  1. 不使用内存来存储数组的长度,或者至少不允许访问内存。授予你内存的内存管理器可能有一些隐藏的记录。如果你发现了这个簿记,不要管它。你用它做的任何事情都是不可携带的。也有可能为您提供固定大小块的内存。你将得到一个至少是T大小的块。这个块中的任何额外内存都被有效地浪费了。
  2. 使用new[]分配的任何内容必须在delete[]中释放,否则您将调用未定义行为。再强调一次,不要乱用低级内存管理器。