Утечка памяти при вызове exit (0) - PullRequest
0 голосов
/ 06 августа 2020

Я читал перед этим:

Когда вы выходите из программы C ++, вызывая функцию exit (), деструкторы объекта не запускаются. Это может привести к тому, что Valgrind сообщит об утечках памяти.

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

Я просматриваю ввод в функции, вызываемой другой функцией main. Как это:

void main()
{
    func1();
}

void func1()
{
    func2();
}

void func2()
{
    std::string str;
    getline(std::cin, str);
    if (str=="exit") exit(0);
}

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Согласно cppreference :

При возврате из основной функции либо с помощью оператора return, либо до конца функции выполняется exit(), передавая аргумент оператора return (или 0, если использовался неявный возврат) как exit_code.

Другими словами, вызов exit аналогичен возврату из main (или падению end), который, в свою очередь, вызывает деструкторы любых статически выделенных объектов перед окончательным завершением программы.

Тем не менее, std::exit предлагает соответствующие гарантии, так что это тот, который нужно использовать.

Живая демонстрация

Изменить: Если вы хотите, чтобы переменные, выделенные в локальной области, были уничтожены (см. Обсуждение), вы можете создать настраиваемое исключение в точке, где вы хотите выйти из программы, и поймать его в main, например

class ExitProgramException {};

void foo ()
{
    ...
    if (exit_program)
    {
        ExitProgramException e;
        throw e;
    }
}

void bar ()
{
    foo ();
}

int main ()
{
    try
    {
        bar ();
    }
    catch (const ExitProgramException& e)
    {
    }
}

Это должно гарантировать правильную размотку стека.

Живая демонстрация

0 голосов
/ 06 августа 2020

Просто сделай if (str=="exit") return;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...