2014-01-15 4 views
1

это утечка памяти ?, должна Foo() является класс с конструктором по умолчаниюУтечка памяти C++ после завершения основной обработки?

int main() 
{ 

    Foo * p = new Foo(); 

    return 0; 
} 

Я думаю, что это не утечка, так как приложение завершается, как только основных целей и якобы ОС выпускает все ресурсов для этого приложения, как только это будет сделано. Правильно ли это предположение?

+3

Да, это правильно для большинства ОС. – Duck

+1

Что не так с 'Foo p;'. Затем объект автоматически уничтожается, когда вы покидаете область действия. – Brandin

ответ

5

Да, в контексте вашей программы это утечка. Вы не отменили выделение Foo.

Будет ли ваша ОС восстанавливать память процесса в любом случае? Может быть, может и нет. Конечно, Windows будет повторно использовать память.

Но если вам нужен универсальный гипер-практический ответ для вашей системы и вашей системы только тогда, да, вы можете уйти от этого.

Однако ни в коем случае косвенные ресурсы не будут освобождены магией от вашей ОС. . Деструктор Foo может включать в себя более чем выделение памяти.

Если вы хотите C++ ответ, или тот, который имеет смысл в плане целостности кода, интеллектуальный дизайн (смеется) и откровенно просто хорошие привычки, нет. Когда кто-то задает твердые практические соображения, что должен найти причину, чтобы сделать delete, это может быть трудно оправдать при принуждении предоставить такие примеры, как дескрипторы файлов, сетевые подключения и рабочие потоки. Но основной здравый смысл диктует, что все эти проблемы: автоматически позаботился о, , без необходимости указывать каждый отдельно, когда вы просто выполняете 5-секундное усилие, чтобы уничтожить свои объекты, когда закончите с ними.

Всего delete it. У вас нет оправдания.

+0

уточняйте «до тех пор, пока деструктор Foo не имеет дополнительных ресурсов для освобождения» – BWG

+1

@BWG: 'struct Foo {char * ptr; int fd, fd2; Foo(): ptr (новый char [50000000]), fd (open ("/ tmp/moronic", O_CREATE | O_APPEND)), fd2 (someTcpConnectionFunction ("google.com", 80)) {}; }; int main() {new Foo(); } // WHOOPS' –

+0

wait ... не освобождает ли OS символы? – BWG

Смежные вопросы