Деструктор для примитивного типа динамически размещаемого массива?
Если я хочу удалить динамически распределенный массив значений примитивного типа:
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
как ты new
s.
В вашем случае вы вызывали new[]
только однажды. Ты должен иновке delete[]
только однажды.
Кроме того, если вы когда-либо сохраняете указатель в переменной-члене, рассмотрите Правило Трех.
Я говорю: "Если вы собираетесь использовать new
а также delete
", потому что вы часто не должны. Используя методы RAII и стандартные контейнеры, вполне возможно написать совершенно полезные программы, которые никогда не вызывают напрямую new
или же delete
,
Если вы пытаетесь поддерживать массив int
s, использовать std::vector
:
class MyClass {
std::vector<int> it;
void SomeFun() { it.resize(10); }
};
Тогда, в своем деструкторе, ничего не делай. Векторы исчезают без вашей помощи.