есть ли утечка памяти, если мы не удаляем память и приложение закрылось

0

Я пишу часть тестового кода в VS2005 следующим образом:

#include <stdio.h>

class Base {
public:
    Base() {printf("Base +\n");};
    ~Base() {printf("Base -\n");};
    char val[1024 * 1024 * 100];
};

void main()
{
    Base *p = new Base();
    return;
}

построить, открыть CMD-окно, а затем выполнить это консольное приложение. открыть диспетчер задач Windows, чтобы посмотреть статус использования памяти.

Я нахожу две вещи: деструктор не называется; 2 нет утечки памяти из результата диспетчера задач Windows.

является ли память удаленной во время выполнения C++, или она удаляется ОС при выходе из процесса? Я просто задаюсь вопросом о том, что происходит с 100 МБ, выделенным в contructor после main() return. Если кто-то может сказать мне, это ценится, и спасибо.

Теги:
memory-leaks

4 ответа

2

После выхода вашей программы операционная система вернет всю используемую память, независимо от того, был ли вызван ее удаление.

Другие ресурсы, такие как сокеты, могут занять больше времени, которые будут выпущены операционной системой, но в конечном итоге будут исправлены.

  • 0
    Итак, это полностью зависит от ОС, чтобы восстановить? Интересно, может ли среда выполнения C ++ помочь в этом, точно так же, как она будет вызывать деструкторы для глобальных переменных, достаточно ли она умен, чтобы делать то же самое для объектов кучи.
  • 0
    Это работа операционной системы. Среда выполнения C ++ не будет вызывать функции, которые вы не говорите ей вызывать, и в этом случае вы не сказали ей вызывать деструктор в этой памяти.
Показать ещё 1 комментарий
1

Это зависит от операционной системы.

Тем не менее, вещи, которые, по вашему мнению, исчезнут, когда приложение уйдет, как правило, остаются в памяти дольше, чем вы думали. В какой-то момент основной код перемещается в некоторую функцию, которая вызывается один раз. И тогда эта функция вызывается несколько раз. И тогда у вас есть утечка. Лучше кодировать в первую очередь, чем исправлять проблемы позже. Может, спустя годы.

0

Как и в случае с другим ответом, это зависит от операционной системы.

Сказав это, он обычно хорошо документировал, что будет очищено после завершения программы.

Обычно это включает в себя частную память приложения, файлы, сокеты, ручки ресурсов, ресурсы GUI и может исключать ресурсы, которые являются глобальными или общими для многих приложений. (например, разделяемая память POSIX сохраняется до перезагрузки, если вы не вызываете shm_unlink).

0

Деструктор не вызван, потому что вы не удаляете указатель класса B. Также после выхода вашего приложения все выделенные ресурсы будут выпущены независимо от того, выпустили ли вы это или нет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню