【问题标题】:Delete array of size 1删除大小为 1 的数组
【发布时间】:2010-06-07 11:28:30
【问题描述】:

这可能是单行答案的候选者。反正我也想知道..

我正在编写一个简单的循环缓冲区,出于某些对问题并不重要的原因,我需要使用双精度数组来实现它。事实上,我还没有研究过其他方法,但由于无论如何都需要数组,所以我没有花太多时间寻找替代方法。

template<typename T>
class CircularBuffer
{
public:
    CircularBuffer(unsigned int size);
    ~CircularBuffer();
    void Resize(unsigned int new_size);
    ...
private:
    T* buffer;
    unsigned int buffer_size;
};

由于我需要动态调整缓冲区大小,因此 buffer_size 既不是 const 也不是模板参数。现在的问题:

在构造期间和函数Resize(int) 中,我只要求大小至少为1,尽管大小为1 的缓冲区实际上不再是缓冲区。当然,使用简单的双精度会更合适,但无论如何。

现在,当在析构函数中删除内部缓冲区时——或者在函数 resize 中——我需要删除分配的内存。问题是,怎么做?第一个候选者当然是delete[] buffer;,但话又说回来,如果我分配了一个大小为 1 的缓冲区,也就是说,如果指针是用 buffer = new T[0] 获取的,是否仍然适合在指针上调用 delete[] 或者我需要打电话给delete buffer;(不带括号)?

谢谢, 阿恩

【问题讨论】:

  • 其实我一直想知道为什么C++没有定义new T;如new T[1];,因为它会简化删除。我唯一的猜测是这是出于优化原因(编译器在调用析构函数时不必创建单步循环)。
  • @Victor Sehr:这样做会限制用户使用 T 类型的无参数构造函数。
  • 这会使删除变得更加复杂,因为您必须使用 delete []。
  • @sharptooth:你什么意思? @Neil Butterworth:如果有的话,它会使删除更简单,因为只需要一种形式的删除。
  • @Viktor Sehr:使用new[] 要求该类型具有默认构造函数。实现newnew[] 将对您使用new 的所有类强制执行该要求。

标签: c++ memory-management


【解决方案1】:

如果你用new T[x]分配内存,你总是用delete[]删除它,即使x≤1。

【讨论】:

    【解决方案2】:

    为什么不使用向量?

    【讨论】:

    • +1 这是对所有此类问题最明智的答案:完全避免手动内存管理。通过std::vector 可以为您带来什么?
    • 好吧,正如我所说,我确实需要使用数组。这是因为我需要与一些使用指向某些元素的指针进行监视的代码集成,并且我需要保证例如最近的元素在 CircularBuffer 对象的生命周期内保持在相同的内存地址。
    • @Arne:如果你不改变你的向量,你就有这个保证。如果你重新分配你的数组,你也没有那个保证。
    • @stefaanv 我自己才意识到这个问题,但还是谢谢。
    • 这作为评论会更有帮助。这是一个非常好的建议,但它没有回答他的问题
    【解决方案3】:

    仅对new[] 返回的地址使用delete[] - 无论缓冲区大小如何。在这种情况下使用 delete 是未定义的行为。

    【讨论】:

      【解决方案4】:

      大小为 1 的缓冲区应分配为buffer = new T[1],然后应使用delete[] buffer。不需要区分为 n = 1 作为特殊情况。 拇指规则::每个new []都应该有对应的delete []

      【讨论】:

        【解决方案5】:

        当您使用“delete[]”时,它知道它必须删除一个对象数组 - 它调用数组中对象的 each 析构函数。不要偏离标准 - 它只会让您很多头疼。使用新时使用删除。当使用 new [] 时,使用 delete []。就这么简单。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-28
          • 1970-01-01
          • 2019-04-09
          • 2019-09-14
          • 1970-01-01
          • 2014-08-02
          相关资源
          最近更新 更多