перед моей основной функцией я объявляю массив статических указателей с новыми указателями на объект, реализующий класс базового массива, и я хочу знать, должен ли я удалить его (или только классы) самостоятельно с помощью "delete".
static AStudentList* a = new AStudentList();
static BStudentList* b = new BStudentList();
static CStudentList* c = new CStudentList();
static DStudentList* d = new DStudentList();
static InstitutionStudentList* instArr[4] = {a, b, c, d};
int main(int argc, char *argv[])
{
}
Вам нужно delete
каждый из четырех объектов до завершения вашей программы:
delete instArr[0];
delete instArr[1];
delete instArr[2];
delete instArr[3];
Вы не должны delete
массив, потому что он не был динамически распределен.
Однако я не вижу причин использовать здесь динамически выделенные объекты. Почему бы просто не делать:
static AStudentList a;
static BStudentList b;
static CStudentList c;
static DStudentList d;
static InstitutionStudentList* instArr[4] = {&a, &b, &c, &d};
Тогда вам нечего delete
.
Простое эмпирическое правило состоит в том, что каждый для каждого new
вызова должен иметь ровно один вызов delete
. Поэтому в этом случае вам нужно удалить 4 раза - 4 указателя, хранящихся в массиве instArr
но вы не должны удалять сам массив.
Автоматизируйте очистку:
static AStudentList a;
static BStudentList b;
static CStudentList c;
static DStudentList d;
static InstituationStudentList* instArray[] = { &a, &b, &c, &d };
Если не существует действительно сильной причины для размещения объектов в куче, не делайте этого. Если вы действительно абсолютно должны кучи выделенных объектов, используйте
static std::unique_ptr<AStudentList> a(new AStudentList);
...
static InstituationStudentList* instArray[] = { a.get(), ... };
Вы также должны стараться избегать любого глобального объекта! Они начинают свою жизнь как наследие, и это быстро растет.
Да, потому что он был выделен на кучу с помощью operator new
. Просто потому, что вы объявляете переменную как статическую, это не означает, что переменная была создана в стеке, и память будет автоматически освобождена.
Когда вы закончите с создаваемыми вами ресурсами, их следует удалить. Если вы просто завершаете программу, тогда это не обязательно, так как система сделает это за вас, но, как вопрос правильного, любой ресурс, который вы создали, должен быть уничтожен вами до завершения. В дополнение к тому, чтобы быть правильным, это облегчит вам работу, если вы сочтете необходимым использовать такие инструменты, как Valgrind, которые отслеживают это для вас, чтобы помочь найти утечки.
Если вам не нужно их удалять, потому что их жизнь - это вся программа, и вам не нужно заменять их новыми объектами, тогда нет никакой цели хранить их в куче.
В противном случае вы должны удалить их.
Вы всегда можете использовать указатель, даже если вы храните их непосредственно в сегменте данных:
static AStudentList a;
static const AStudentList* aPtr() { return &a; }
Да, ты должен. Вы всегда должны освобождать любую память, которую вы выделяете.
При этом вы, вероятно, отпустите его, как раз перед вызовом exit()
или иначе закончите свою программу. Ядро операционной системы автоматически освободит память. Тогда конечный результат в основном тот же.
Рассмотрите будущее при создании кода. Возможно, ваш код будет каким-то плагином в будущем, и если вы затем не сможете освободить static
память, вы введете утечку памяти. Также, если позже вы решите удалить static
ключевое слово.