Деструктор для примитивного типа динамически размещаемого массива?

Если я хочу удалить динамически распределенный массив значений примитивного типа:

int *it = new int[10]

я просто положил delete [] it в деструкторе позаботиться об освобождении памяти должным образом?

ИЛИ ЖЕ

Понимая, что, поскольку указатель является примитивным типом, удаление динамически размещенного массива требует выполнения чего-то подобного в деструкторе:

for (size_t idx = 0; idx != 5; ++idx)
        delete sp[idx];
    delete[] sp;

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

2 ответа

Решение

Если у вас есть:

int* it = new int[10];

правильный способ delete это:

delete[] it;

Если у вас есть переменная-член этого типа, вам нужно реализовать конструктор копирования и оператор присваивания, так как их версии по умолчанию недостаточно или вы не можете скопировать класс.

Поскольку это C++, я бы предложил использовать std::vector<int> вместо этого, как это будет обрабатывать управление памятью для вас.

Если вы собираетесь использовать new а также delete, общее правило, которому нужно следовать, состоит в следующем: используйте ровно столько deleteкак ты news.

В вашем случае вы вызывали new[] только однажды. Ты должен иновке delete[] только однажды.

Кроме того, если вы когда-либо сохраняете указатель в переменной-члене, рассмотрите Правило Трех.

Я говорю: "Если вы собираетесь использовать new а также delete", потому что вы часто не должны. Используя методы RAII и стандартные контейнеры, вполне возможно написать совершенно полезные программы, которые никогда не вызывают напрямую new или же delete,

Если вы пытаетесь поддерживать массив ints, использовать std::vector:

class MyClass {
    std::vector<int> it;

    void SomeFun() { it.resize(10); }
};

Тогда, в своем деструкторе, ничего не делай. Векторы исчезают без вашей помощи.

Другие вопросы по тегам