я должен удалить статический объект в C ++

0

перед моей основной функцией я объявляю массив статических указателей с новыми указателями на объект, реализующий класс базового массива, и я хочу знать, должен ли я удалить его (или только классы) самостоятельно с помощью "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[])
{
}
  • 2
    Зачем использовать выделение кучи для статического?
Теги:

7 ответов

4
Лучший ответ

Вам нужно 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.

  • 0
    Хорошая мысль о том, чтобы вообще не использовать динамически размещаемые объекты.
  • 1
    +1 за избежание динамического размещения. Однако их явное удаление до завершения программы потенциально опасно; Что делать, если есть локальная переменная, которая зависит от их существования? Лучшим подходом (для динамического размещения) было бы использование интеллектуального указателя для автоматического управления их временем жизни.
Показать ещё 1 комментарий
3

Простое эмпирическое правило состоит в том, что каждый для каждого new вызова должен иметь ровно один вызов delete. Поэтому в этом случае вам нужно удалить 4 раза - 4 указателя, хранящихся в массиве instArr но вы не должны удалять сам массив.

2

Автоматизируйте очистку:

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(), ... };

Вы также должны стараться избегать любого глобального объекта! Они начинают свою жизнь как наследие, и это быстро растет.

  • 0
    +1 первый ответ, чтобы упомянуть умные указатели.
  • 0
    хорошо, я попробую это ..
1

Да, потому что он был выделен на кучу с помощью operator new. Просто потому, что вы объявляете переменную как статическую, это не означает, что переменная была создана в стеке, и память будет автоматически освобождена.

0

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

0

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

В противном случае вы должны удалить их.

Вы всегда можете использовать указатель, даже если вы храните их непосредственно в сегменте данных:

static AStudentList a;
static const AStudentList* aPtr() { return &a; }
0

Да, ты должен. Вы всегда должны освобождать любую память, которую вы выделяете.

При этом вы, вероятно, отпустите его, как раз перед вызовом exit() или иначе закончите свою программу. Ядро операционной системы автоматически освободит память. Тогда конечный результат в основном тот же.

Рассмотрите будущее при создании кода. Возможно, ваш код будет каким-то плагином в будущем, и если вы затем не сможете освободить static память, вы введете утечку памяти. Также, если позже вы решите удалить static ключевое слово.

  • 0
    В очень сложных программах это может быть оптимизация производительности, чтобы не удалять все выделения памяти непосредственно перед закрытием программы. Но очень редко можно заметить разницу в производительности

Ещё вопросы

Сообщество Overcoder
Наверх
Меню