Вызываются ли деструкторы, если программа закрыта вручную? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть класс, в одной из его функций я использую memset для выделения памяти, затем программа входит в цикл, но мой вопрос, даже если я установил delete[] в деструкторе, если я закрою программущелчок по X вызовет деструктор и освободит память?Или его утечка?

class Example {
public:
    int *a;
    Example() {
        a = new int[100];
        memset(a, 0, sizeof(a)); //Allocating memory
    }

    ~Example() {
        delete[] a;
    }
};

int main() {
    Example(); //Memory allocated.
    while (true) {
        //Other code here, if i close the program now (Pressing X), will the memory be liberated?
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Поскольку вы упоминаете "X", я предполагаю, что вы говорите о приложении для Windows.Linux, скорее всего, похож на другой, но для других операционных систем и систем ekbedded ваш пробег может отличаться.

Теперь о Windows.Краткий ответ - закрытие вашего приложения автоматически освобождает всю его память.Фактически, ОС намного эффективнее, чем ваше приложение, поэтому, если вы знаете, что ваше приложение закрывается, вы можете пропустить все деструкторы и освобождение памяти и т. Д. Вы сэкономите время.В любом случае ОС сделает это за вас.То же самое касается закрытия любых файлов, сетевых сокетов, дескрипторов ядра, окон и т. Д. Операционная система просто отбрасывает все, что принадлежит вашему процессу, одним махом.

0 голосов
/ 11 февраля 2019

если я закрою программу, нажав X, будет ли вызван деструктор и освобождена ли память?

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

Или ее утечка? J

Когда программа завершается, большинство систем времени выполнения проверяют, чтобы используемая программой память стала доступной для других программ.В этом смысле память не протекает, но с точки зрения отдельной программы, память протекает.

PS

Обратите внимание, что я говорю отточка зрения основного рабочего стола / ноутбука.Встроенные системы могут вести себя совершенно по-разному.

...