这可能是单行答案的候选人。无论如何我想知道..
我正在编写一个简单的循环缓冲区,由于某些原因,这对于我需要使用双精度数组实现它的问题并不重要。事实上,我没有研究过其他方法,但是因为无论如何都需要阵列,所以我没有花太多时间寻找替代方案。
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;
(不带括号)?
谢谢, ·阿尔
答案 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 []。就这么简单。