Подтвердить что ты не робот

С++ Удаление статических данных

Если у меня есть класс, который содержит частные статические данные, выделенные в куче, которые никогда не изменяются, когда, если вообще, я должен удалить его?

Как я понимаю, сам класс никогда не строится (потому что классы не являются объектами первого класса в С++), тогда нет деструктора для удаления статических данных? Im new на С++ так извините, если мое понимание С++ фундаментально ошибочно или если ответ очевиден! Спасибо заранее, ell.

4b9b3361

Ответ 1

Если данные статичны, они не выделяются в куче, и это будет разрушено во время завершения процесса.

Если это указатель на статические данные, например:

Something* MyClass::aPointer = new Something;

то, как и все другие динамически распределенные данные, это будет только уничтожается при его удалении. Существует два частых решения:

  • используйте интеллектуальный указатель, который имеет деструктор, который его удаляет, или

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

Ответ 2

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

Однако, если вы используете static в указателе как:

static A *pA = new A();

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

Ответ 3

Вы можете поместить этот класс в std::auto_ptr. Затем он автоматически удаляется при выключении программы. В противном случае средства утечки памяти будут жаловаться, что ваш класс протекает. С другой стороны, эта утечка памяти безвредна, поскольку программа завершена.

Ответ 4

Я предполагаю, что вы на самом деле ссылаетесь на статический указатель на объект в куче?

Это никогда не будет автоматически удалено, вы должны сделать это самостоятельно. В большинстве случаев это достаточно, чтобы программа закончилась, и ОС выполнила очистку, если вы не используете инструмент проверки памяти, или деструктор не имеет побочных эффектов, которые вам нужны.

Самый простой способ - использовать смарт-указатель, который автоматически удалит объект, когда никто больше не обращается к нему. Вы можете сохранить копию указателя в main, если есть моменты, когда у кого-то не будет копии, тогда объект будет удален, когда main выйдет.

Ответ 5

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