Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除大小为1的数组_C++_Memory Management - Fatal编程技术网

C++ 删除大小为1的数组

C++ 删除大小为1的数组,c++,memory-management,C++,Memory Management,这可能是一个单线答案的候选答案。无论如何我都想知道 我正在编写一个简单的循环缓冲区,出于一些对这个问题不重要的原因,我需要使用一个double数组来实现它。事实上,我还没有研究其他方法来实现这一点,但由于无论如何都需要一个数组,所以我没有花太多时间寻找替代方法 template<typename T> class CircularBuffer { public: CircularBuffer(unsigned int size); ~CircularBuffer();

这可能是一个单线答案的候选答案。无论如何我都想知道

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

template<typename T>
class CircularBuffer
{
public:
    CircularBuffer(unsigned int size);
    ~CircularBuffer();
    void Resize(unsigned int new_size);
    ...
private:
    T* buffer;
    unsigned int buffer_size;
};
模板
类循环缓冲
{
公众:
循环缓冲(无符号整数大小);
~CircularBuffer();
void Resize(unsigned int new_size);
...
私人:
T*缓冲器;
无符号整数缓冲区大小;
};
因为我需要动态调整缓冲区的大小,所以缓冲区大小既不是
const
,也不是模板参数。现在的问题是:

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

现在,当在析构函数中删除内部缓冲区时,或者在函数中为此调整大小时,我需要删除分配的内存。问题是,怎么做?第一个候选当然是
delete[]缓冲区
但是,如果我分配了一个大小为1的缓冲区,也就是说,如果指针是通过
buffer=new T[0]
获得的,那么在指针上调用
delete[]
还是需要调用
delete buffer(不带括号)

谢谢,
Arne

如果使用
new T[x]
分配内存,则始终使用
delete[]
删除它,即使x≤ 1.

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

大小为1的缓冲区应分配为
buffer=new T[1]
,然后应使用
delete[]buffer
。不需要区分n=1作为特例。
拇指法则::每个
新[]
都应该有相应的
删除[]

为什么不使用向量?

当使用“删除[]”时,它知道它必须删除一个对象数组-它调用数组中每个对象的析构函数。不要偏离标准——这只会让你头疼。使用“新建”时,请使用“删除”。使用新[]时,请使用删除[]。简单的说,

实际上我一直在想为什么C++没有定义<代码>新的t<代码>;as
newt[1]因为它将简化删除。我唯一的猜测是,这是出于优化原因(编译器在调用析构函数时不必创建一步循环)。@Victor Sehr:这样做会将用户限制为t类型的无参数构造函数。这会使删除更加复杂,因为您必须使用delete[]@Neil Butterworth:如果有什么区别的话,它会使删除变得更简单,因为只需要一种形式的删除。@Viktor Sehr:使用
new[]
要求该类型具有默认构造函数。通过
new[]
实现
new
将在所有使用
new
on的类上强制执行该要求。+1这是所有此类问题最明智的答案:完全避免手动内存管理。它通过std::vector给你买了什么?正如我说的,我确实需要使用数组。这是因为我需要与一些使用指向某些元素的指针进行监视的代码集成,并且我需要保证,例如,在CircularBuffer对象的生命周期内,最新的elment保持在相同的内存地址。@Arne:如果不更改向量,您就有了这种保证。如果您重新分配阵列,您也无法保证。@stefaanv我自己刚刚意识到这个问题,但无论如何还是要感谢您。作为一个评论,这将更有帮助。这是一个非常好的建议,但它不能回答他的问题