Для практических целей ответ на ваш вопрос - да.Современные операционные системы обычно освобождают память, выделенную процессом, когда этот процесс выключен.Однако зависеть от этого поведения - очень плохая практика.Даже если мы можем быть уверены, что операционные системы всегда будут работать таким образом, код хрупок.Если какая-то функция, которая не освобождает память, внезапно повторно используется для другой цели, это может привести к утечке памяти на уровне приложения.
Тем не менее, характер этого вопроса и приведенный пример требует, с этической точки зрения, от меняукажите вам и вашей команде на RAII.
int *pIntPtr = new int;
...
delete pIntPtr;
Этот код пахнет утечками памяти.Если что-то [...] выбрасывает, у вас есть утечка памяти.Существует несколько решений:
int *pIntPtr = 0;
try
{
pIntPtr = new int;
...
}
catch (...)
{
delete pIntPtr;
throw;
}
delete pIntPtr;
Второе решение с использованием nothrow (не обязательно намного лучше, чем первое, но допускает разумную инициализацию pIntPtr во время его определения):
int *pIntPtr = new(nothrow) int;
if (pIntPtr)
{
try
{
...
}
catch (...)
{
delete pIntPtr;
throw;
}
delete pIntPtr;
}
Исамый простой способ:
scoped_ptr<int> pIntPtr(new int);
...
В этом последнем и лучшем примере нет необходимости вызывать delete для pIntPtr, поскольку это делается автоматически независимо от того, как мы покидаем этот блок (ура для RAII и интеллектуальных указателей).