【发布时间】: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[]要求该类型具有默认构造函数。实现new到new[]将对您使用new的所有类强制执行该要求。
标签: c++ memory-management