Процесс всегда вернет память после завершения.На самом деле это форма сборки мусора, которая доступна даже программистам на C и C ++, хотя многие такие люди являются пуристами и не любят ее использовать, в частности, потому что это проявится как утечка в программах проверки памяти.
«Реальным» определением утечки является память, которую вы больше не хотите использовать, но в любом случае она используется, и, в частности, память, которая постоянно выделяется так, что у вас может быть недостаточно памяти.
Если у вас есть статический кеш, и вы добавляете в него элементы и никогда не удаляете их, в конечном итоге вам не хватит памяти (если ваш кэш «безлимитный»), даже если вы используете язык со сборкой мусора, так как память все еще остаетсясчитается "в использовании".
Если ваш язык C ++ и вы используете такую конструкцию:
Foo& getTheFoo()
{
static Foo theFoo;
return theFoo;
}
, это статическое размещение объекта.Он будет очищен при выходе из вашей программы и вызовет все деструкторы.Может быть опасность того, что вы будете делать подобные вещи в нескольких местах, где вы полагаетесь на порядок уничтожения.Также это может означать, что вы получаете ошибки, или ваша программа может занять много времени для выхода (и мы все знаем, как сильно мы ненавидим приложения, для закрытия которых требуется огромное количество времени, когда мы просто хотим их закрыть).
И поэтому многие предпочитают «негерметичное» приложение, которое просто использует указатель в вышеуказанной ситуации.На самом деле это не «утечка», потому что указанный объект доступен для использования, когда он вам нужен, и он будет очищен, когда ваше приложение завершит работу так же, как ваше «статически распределенное».
ByКстати, для обхода проверки памяти у вас всегда может быть какой-то флаг, таким образом, у вас есть объект (да, статический)
class FooDestructor
{
public:
~FooDestructor()
{
if( usingMemoryChecker() )
delete &getTheFoo(); // was allocated with new and not as static
}
};
static FooDestructor fooDestructor;