Хорошей практикой является использование правильной стратегии для окончания срока службы объекта. Для динамических объектов это означает, что вы удалите новое, освободите то, что вы используете, и так далее. Является ли этот объект постоянным или нет, не влияет на то, должен ли закончиться срок его жизни.
Быть постоянным или изменчивым - это свойства, которые существуют в течение времени жизни объекта и заканчиваются выражением удаления или вызовом free. Независимо от ваших собственных взглядов на вопрос или того, как все работает на других языках, именно так работает объектная модель C ++. Простой пример, демонстрирующий, как язык переводит выражения delete в вызовы оператора delete:
#include <new>
void* operator new(std::size_t size);
void operator delete(void* p);
int main() {
delete new int(); // int* to void*, since this is also an allowed
// implicit conversion, it may not be clear what is happening
// however, these are clearly not implicit conversions:
delete new int const(); // int const * to void*
delete new int volatile(); // int volatile* to void*
delete new int const volatile(); // int const volatile* to void*
}
Другой пример, но, возможно, менее понятный, заключается в том, почему вы не можете перегрузить ctors для const:
struct S {
S() const; // not allowed
};
Объект является константным только после того, как он создан (иначе его время жизни начинается; происходит, когда ctor возвращается нормально) и до того, как он уничтожается (иначе его время жизни заканчивается; происходит, когда вводится dtor). До или после этого времени жизни у вас может быть указатель типа T const*
(например), но он не указывает на объект и разыменовывает его как UB.
То же самое относится и к C, за исключением того, что вы должны учитывать, что C имеет примерно 40-летнюю историю и преуспел в поддержании большой последовательности в течение большей части этого времени.
(Я полагаю, что этот вопрос субъективен и аргументирован * и проголосовал бы за его закрытие таким образом, за исключением того, что я, очевидно, помог зажечь дискуссию; поэтому ответил как CW.)