Удалить массив размером 1 - PullRequest
3 голосов
/ 07 июня 2010

Возможно, это кандидат для однострочного ответа. Я бы все равно хотел это знать ..

Я пишу простой циклический буфер и по некоторым причинам, которые не важны для вопроса, мне нужно реализовать его, используя массив значений типа 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;
};

Так как мне нужен динамический размер буфера, то buffer_size не является ни const, ни параметром шаблона. Теперь вопрос:

Во время построения и в функции Resize(int) Мне требуется, чтобы размер был как минимум один, хотя буфер размером один фактически больше не является буфером. Конечно, вместо этого было бы лучше использовать простой double, но в любом случае.

Теперь при удалении внутреннего буфера в деструкторе - или в функции resize в этом отношении - мне нужно удалить выделенную память. Вопрос в том, как? Первый кандидат, конечно, delete[] buffer;, но с другой стороны, если я выделил буфер размером один, то есть если указатель был получен с помощью buffer = new T[0], все еще уместно вызвать delete[] для указателя или мне нужно позвонить delete buffer; (без скобок)?

Спасибо, Arne

Ответы [ 5 ]

10 голосов
/ 07 июня 2010

Если вы выделяете память с помощью new T[x], вы всегда удаляете ее с помощью delete[], даже если x ≤ 1.

7 голосов
/ 07 июня 2010

Почему бы не использовать вектор?

5 голосов
/ 07 июня 2010

Используйте delete[] только для адресов, возвращаемых new[] - независимо от размера буфера. Использование delete в этом случае - неопределенное поведение.

1 голос
/ 07 июня 2010

буфер размера 1 должен быть выделен как buffer = new T[1], а затем следует использовать delete[] buffer.Не нужно дифференцировать как n = 1 как частный случай. Правило большого пальца: : каждый new [] должен иметь соответствующий delete []

0 голосов
/ 07 июня 2010

Когда вы используете «delete []», он знает, что должен удалить массив объектов - он вызывает каждый деструктор объектов в массиве. Не ускользайте от стандарта - он даст вам много головных болей. При использовании нового использования удалить. При использовании new [] используйте delete []. Просто так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...