Сбой процедуры размотки стека при возникновении исключения после вызова функции, которая возвращает структуру. - PullRequest
0 голосов
/ 07 декабря 2011

Ранее на этой неделе я опубликовал еще два вопроса об исключениях и о том, почему моя программа не обрабатывает исключения.Я «разделил» мою программу из ненужного кода, и вот она:

#include <string>
#include <stdexcept>
#include <iostream>

class some_class
{
    public:
    some_class(const some_class &);
    some_class(const char *);

    std::string m_id;
};

some_class::some_class(const char *p_id) :
    m_id(p_id)
{
}

some_class::some_class(const some_class &p_that) :
    m_id(p_that.m_id)
{
}

extern some_class return_a_struct(const char *p_id); 

int run()
{
    some_class l = return_a_struct("john");

    throw std::runtime_error("something bad happened");
    return 0;
}

extern "C" int main(int, char **)
{
    try
    {
        run();
    }
    catch(const std::exception &p)
    {
        std::cout << p.what() << std::endl;
    }
    return 0;
}

some_class return_a_struct(const char *p_id)
{
    return some_class(p_id);
}

Вывод должен быть таким:,

В run () я вызываю функцию, которая возвращает some_class.Возвращенный объект затем копируется в объект, которому я его назначаю.Все идет нормально.Но затем я выкидываю исключение, и программа никогда не достигает обработчика catch в функции main.Вылетает следующее сообщение:

This application has requested the Runtime to terminate it in an unusual way
Please contact the application's support team for more information.

Если я пропущу вызов return_a_struct (), этого не произойдет.

Вопрос: это ошибка в gcc (часть последней версии MinGW, работающей в Windows 7), или я что-то делаю не так.Есть ли обходные пути?

GCC-опции:

gcc -fexceptions -g3 test_case.cpp -l libstdc++ -o test_case.exe

1 Ответ

0 голосов
/ 07 декабря 2011

g++ test_case.cpp -o test_case.exe

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