С++ Удаление статических данных
Если у меня есть класс, который содержит частные статические данные, выделенные в куче, которые никогда не изменяются, когда, если вообще, я должен удалить его?
Как я понимаю, сам класс никогда не строится (потому что классы не являются объектами первого класса в С++), тогда нет деструктора для удаления статических данных? Im new на С++ так извините, если мое понимание С++ фундаментально ошибочно или если ответ очевиден!
Спасибо заранее, ell.
Ответы
Ответ 1
Если данные статичны, они не выделяются в куче, и это будет
разрушено во время завершения процесса.
Если это указатель на статические данные, например:
Something* MyClass::aPointer = new Something;
то, как и все другие динамически распределенные данные, это будет только
уничтожается при его удалении. Существует два частых решения:
-
используйте интеллектуальный указатель, который имеет деструктор, который его удаляет, или
-
не удалять его; в большинстве случаев нет причин для вызова деструктора, и если вы случайно используете экземпляр в деструкторах других статических объектов, вы столкнетесь с проблемой уничтожения.
Ответ 2
static
означает, что он сохраняет всю продолжительность программы.
Однако, если вы используете static
в указателе как:
static A *pA = new A();
то вы можете удалить это, написав delete pA
. Но это не отменяет моего первого заявления. Поскольку объект, на который указывает статический указатель, не является статическим. Его указатель статичен, а не объект, на который указывает указатель.
Ответ 3
Вы можете поместить этот класс в std::auto_ptr
. Затем он автоматически удаляется при выключении программы. В противном случае средства утечки памяти будут жаловаться, что ваш класс протекает. С другой стороны, эта утечка памяти безвредна, поскольку программа завершена.
Ответ 4
Я предполагаю, что вы на самом деле ссылаетесь на статический указатель на объект в куче?
Это никогда не будет автоматически удалено, вы должны сделать это самостоятельно. В большинстве случаев это достаточно, чтобы программа закончилась, и ОС выполнила очистку, если вы не используете инструмент проверки памяти, или деструктор не имеет побочных эффектов, которые вам нужны.
Самый простой способ - использовать смарт-указатель, который автоматически удалит объект, когда никто больше не обращается к нему. Вы можете сохранить копию указателя в main
, если есть моменты, когда у кого-то не будет копии, тогда объект будет удален, когда main
выйдет.
Ответ 5
статические данные, выделенные в куче, означают статический элемент-указатель. Если это так, вы можете выделить ему память.