Как именно моя программа C ++ завершает работу, когда ей не хватает памяти? - PullRequest
0 голосов
/ 24 марта 2010

Следующая программа C ++ падает на моем компьютере с Windows XP с сообщением «Аварийное завершение программы»

class Thing {};
int main()
{    
    for (;;) new Thing();    
}

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

Ответы [ 4 ]

8 голосов
/ 24 марта 2010

Вы правы, это проблема нехватки памяти, которая приводит к завершению вашей программы. Но не Windows решает завершить его "ненормальным завершением программы". Это среда выполнения C ++ («msvcrt * .dll» в Windows), которая вызывает исключение std::bad_alloc, когда new Thing не удается выделить память.

Вы можете проверить это с помощью простого изменения:

#include <exception>
#include <iostream>
class Thing {};
int main()
{
    try
    {    
        for (;;) new Thing();    
    }
    catch(std::bad_alloc e)
    {
        std::cout << "ending with bad_alloc" << std::endl;
    }        
}

Это нормально завершит программу, когда программе не хватит памяти. Если вы не поймаете это исключение, необработанное исключение будет обработано средой выполнения C ++, что приведет к созданию этого знаменитого сообщения «Аварийное завершение программы» (или что-то подобное).

3 голосов
/ 24 марта 2010

Это CRT убивает вашу программу. Требуемое поведение для необработанного исключения (здесь std :: bad_alloc) - это вызов terminate () . Который отображает сообщение «Аварийное завершение программы» в реализации MSVC и вызывает abort (), чтобы убить программу.

1 голос
/ 24 марта 2010

Вы пытались запустить его в режиме отладки?

В моем случае (Win7) он выдал эту ошибку: Это приложение запросило среду выполнения, чтобы завершить его необычным способом.Пожалуйста, свяжитесь со службой поддержки приложения для получения дополнительной информации.

Но в режиме отладки он показал, что оператор new выбросил исключение bad_alloc, которое точно означает нехватку памяти.

0 голосов
/ 24 марта 2010

Несомненно, у вас заканчивается VM.

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