Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/140: Рейтинг темы: голосов - 140, средняя оценка - 4.96
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607

Terminate called without an active exception

12.01.2020, 17:16. Показов 33386. Ответов 73
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При компиляции такого примера:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class TestClass
{
public:
    TestClass()
    {
        auto func_ptr = &TestClass::Process;
        m_pthread = new std::thread(func_ptr, this);
    }
    ~TestClass() { delete m_pthread; }
private:
    void Process()
    {
          std::cerr << "run" <<  std::endl;
    }
    std::thread* m_pthread = nullptr;
};
 
int main(int argc, char *argv[])
{
    TestClass* ptc = new TestClass;
    std::this_thread::sleep_for(std::chrono::seconds(1));
    delete ptc;
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cerr << "finished" << std::endl;
    return 0;
}
Возникает ошибка:
run
terminate called without an active exception
Press <RETURN> to close this window...
Т.е. текст finished даже не выводится.
Санитайзеры включены:
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
set (CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=address")
Но без них врде тоже самое.
Что я делаю не так ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.01.2020, 17:16
Ответы с готовыми решениями:

Terminate called С++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { string s; cin &gt;&gt; s;

Ошибка: terminate called after throwing an instance of 'std::bad_alloc'
Доброго времени суток В сурсе #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;vector&gt; #include &lt;array&gt; #include...

Runtime ошибка - terminate called after throwing an instance of 'std::out_of_range'
Пишу что-то вроде компилятора. Так как никакой литературы по созданию компилятора не читал в моём коде появляються кучи Костылей и...

73
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.01.2020, 06:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от squareroot Посмотреть сообщение
А покакой причине санитайзер после форка детектирует утечку памяти ?
Где-то ошибка у вас.

Добавлено через 48 секунд

Не по теме:

squareroot, Вы, кстати, уже несколько нарушаете правила форума. Проблема ваша изначальная давно решена.

0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
14.01.2020, 06:49  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Где-то ошибка у вас.
Вот пример, который воспроизводит ситуацию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class TestClass
{
public:
    TestClass()
    {
        auto func_ptr = &TestClass::Process;
        m_pthread = new std::thread(func_ptr, this);
        m_pthread->detach();
    }
    ~TestClass()
    {
        auto ret = fork();
        if (ret != 0) abort();
        delete m_pthread;
    }
    bool isRunning() const {return m_isRunning.load(); }
private:
    void Process()
    {
 
        std::cerr << "run code:";
 
        std::exception_ptr e_ptr;
        try
        {
            //throw "error";
            bool isRunn = isRunning();
            while(!isRunn)
            {
                isRunn = isRunning();
                //pthread_testcancel();
            }
 
            //m_active_flag_setter.set_value_at_thread_exit();
        }
        catch(...)
        {
            e_ptr = std::current_exception();
        }
    }
    std::thread* m_pthread = nullptr;
    std::atomic_bool m_isRunning = false;
};
 
int main(int argc, char *argv[])
{
    TestClass* ptc = new TestClass;
    std::this_thread::sleep_for(std::chrono::milliseconds(300));
    delete ptc;
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cerr << "finished" << std::endl;
    return 0;
}

Цитата Сообщение от DrOffset Посмотреть сообщение

Не по теме:

squareroot, Вы, кстати, уже несколько нарушаете правила форума. Проблема ваша изначальная давно решена.

Проблема изначально побудившая меня создать эту тему не решена. Я просто немного накасячил при воспроизводстве примера, поэтому название неудачное.


Вывод:

======================================== =========================
==9378==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 32 byte(s) in 1 object(s) allocated from:
#0 0x7f2f4ee6a458 in operator new(unsigned long) (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xe0458)
#1 0x55b39c0c7ab9 in std::unique_ptr<std::thread::_State, std::default_delete<std::thread::_State> > std::thread::_S_make_state<std::thread:: _Invoker<std::tuple<void (TestClass::*)(), TestClass*> > >(std::thread::_Invoker<std::tuple<voi d (TestClass::*)(), TestClass*> >&&) /usr/include/c++/7/thread:197
#2 0x55b39c0c55eb in std::thread::thread<void (TestClass::*&)(), TestClass*>(void (TestClass::*&)(), TestClass*&&) /usr/include/c++/7/thread:126
#3 0x55b39c0c2a89 in TestClass::TestClass() /home/user/MySoftware/itv_testtask/itv_testtask/unittests/main_test_general.cpp:281
#4 0x55b39c0bf2b0 in main /home/user/MySoftware/itv_testtask/itv_testtask/unittests/main_test_general.cpp:351
#5 0x7f2f4df9bb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)

SUMMARY: AddressSanitizer: 32 byte(s) leaked in 1 allocation(s).
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.01.2020, 07:04
Цитата Сообщение от squareroot Посмотреть сообщение
if (ret != 0) abort();
Память под объект потока у вас в childparent-процессе не освобождается.

Добавлено через 40 секунд
Цитата Сообщение от squareroot Посмотреть сообщение
Проблема изначально побудившая меня создать эту тему не решена.
Что это за проблема?
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
14.01.2020, 07:19  [ТС]
DrOffset, Проблема в то что ругался синитайзер в конечном счёте из-за того что процедура потока "живёт" дольше чем мне хочется, в тесте на "зависание" процедуры потока.

Проблема оказывается даже не форке.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class TestClass
{
public:
    TestClass()
    {
        auto func_ptr = &TestClass::Process;
        m_pthread = new std::thread(func_ptr, this);
        m_pthread->detach();
    }
    ~TestClass()
    {
        delete m_pthread;
    }
 
    bool isRunning() const {return m_isRunning.load(); }
private:
    void Process()
    {
 
        std::cerr << "run code:";
        try
        {
            bool isRunn = isRunning();
            while(!isRunn)
            {
                isRunn = isRunning();
            }
 
        }
        catch(...)
        {
        }
    }
    std::thread* m_pthread = nullptr;
    std::atomic_bool m_isRunning = false;
};
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.01.2020, 07:24
Цитата Сообщение от squareroot Посмотреть сообщение
Проблема оказывается даже не форке.
В форке своя проблема, здесь своя. Это разные проблемы.

Добавлено через 47 секунд
Цитата Сообщение от squareroot Посмотреть сообщение
процедура потока "живёт" дольше чем мне хочется, в тесте на "зависание" процедуры потока.
Выше мы это уже обсудили.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
14.01.2020, 07:26  [ТС]
DrOffset, обсудить - обсудили, а решения не видно.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.01.2020, 07:28
Цитата Сообщение от squareroot Посмотреть сообщение
а решения не видно.
Я вам дал решение. Не используйте detach.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
14.01.2020, 07:31  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Я вам дал решение. Не используйте detach.
И ? Навечно зависнуть в join(), если процедура потока зависла ? Теже яйца, только вид сбоку.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.01.2020, 07:36
Цитата Сообщение от squareroot Посмотреть сообщение
И ? Навечно зависнуть в join(), если процедура потока зависла ? Теже яйца, только вид сбоку.
Это уже другая проблема. В нормальной ситуации процедура потока не может зависнуть. Если она зависла на системном вызове - любой системный вызов - это cancellation point, значит можно свободно использовать deffered cancel (об этом шла речь выше и даже список системных вызовов был дан). Если же она зависла на бесконечном цикле, как у вас, то это просто напросто ошибка программиста.
Если же мы рассматриваем абстрактный процесс с произвольным кодом, например из плагина, то я вам уже объяснил, что в общем случае она решения в такой постановке не имеет: т.е. потоки тут не подходят.
Если вы не согласны с этим, предлагаю подождать кого-то еще (кто скажет тоже самое).
А я, пожалуй, от темы отпишусь.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
14.01.2020, 07:41  [ТС]
DrOffset, Спасибо за желание помочь, но я себе не мыслю процедуру потока без try {} catch (...)
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.01.2020, 09:03
squareroot, Terminate called without an active exception
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
14.01.2020, 09:05  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Это пример безопасного кода ?
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
14.01.2020, 09:09
squareroot, да. Он работает в любых нормальных условиях. Бесконечные циклы без возможности выхода из них даже по стандарту С++ не допускаются. Если вы хотите отлавливать откровенно ошибочные действия, то потоки, я повторюсь, вам не подойдут.
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
14.01.2020, 09:45  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
squareroot, да. Он работает в любых нормальных условиях. Бесконечные циклы без возможности выхода из них даже по стандарту С++ не допускаются. Если вы хотите отлавливать откровенно ошибочные действия, то потоки, я повторюсь, вам не подойдут.
Бесконечный цикл это модельное представление длительной операции или работы потока с низким приоритетом. Откровенно ошибочный или случайно ошибочный это всё жизненные ситуации. Я уже понял что хорошего решения не будет, но я всегда при создании темы приследую двойные намерения 1)Решить проблему 2)Получить обоснование решения. В данном случае я был бы рад максмальном всестороннему обсуждению данной темы, так как хорошего решения нет.

Но я не сомневаюсь в ваших уникальных способностях и несгибаемой логики. Если Вы уверены что Вам нечего добавить к данной теме, то Вы вольны отписаться от неё и/или перейти в режим ридонли.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.01.2020, 09:45

Не понимаю из-за чего выскакивает: terminate called after throwing instance of std bad_alloc
Не понимаю из-за чего выскакивает ошибка при компиляции: terminate called after throwing instance of std bad_alloc. Буду благодарен, если...

Terminate called after throwing an instance of 'int' Aborted -Ошибка, как быть?
Здравствуйте! Выдается такая ошибка, не понимаю почему. terminate called after throwing an instance of 'int' Aborted команда:...

Ошибка при повторном запуске: terminate called after throwing an instance of 'std::ios_base::failure'
Здравствуйте, вот этот кусок кода(дан ниже) при повторном запуске программы выдает ошибку: terminate called after throwing an instance of...

Ошибка при выполнении запроса к mysql (terminate called after throwing an instance of 'sql::SQLException')
Всем привет. Пишу программу - демон, выполняющую изменения в базе данных в случае появления определённых флагов. Использую MYSQL...

Ошибка terminate called after throwing an instance of 'std::bad_alloc' при работе с типом std::string
Добрый вечер, при работе функции возникает ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
74
Ответ Создать тему
Новые блоги и статьи
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru