删除大小为1的数组

时间:2010-06-07 11:28:31

标签: c++ memory-management

这可能是单行答案的候选人。无论如何我想知道..

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

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的缓冲区实际上不再是缓冲区。当然,使用简单的双重替代会更合适,但无论如何。

现在当在析构函数中删除内部缓冲区时 - 或者在函数调整大小时 - 我需要删除分配的内存。问题是,怎么样?第一个候选人当然是delete[] buffer;,但是如果我已经分配了一个大小为1的缓冲区,即如果指针是使用buffer = new T[0]获得的,那么是否仍然适合调用delete[]指针还是我需要调用delete buffer;(不带括号)?

谢谢, ·阿尔

5 个答案:

答案 0 :(得分:10)

如果您使用new T[x]分配内存,则始终使用delete[]将其删除,即使x≤1。

答案 1 :(得分:7)

为什么不使用矢量?

答案 2 :(得分:5)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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