Приложение C ++ вылетает с ошибкой atexit () - PullRequest
0 голосов
/ 18 января 2019

У нас есть приложение для установки, которое использует MFC и написано на c ++. Оно периодически прерывается при вставленном стеке вызовов.Этот сбой происходит, когда приложение заканчивается.Мы можем видеть ссылку atexit () в стеке вызовов со статической переменной svUniqueUpdates, которая используется внутри функции для некоторых вычислений.Действительно ли этот сбой вызван atexit () и как его исправить?

Стек вызовов

0 Id: 3f30.8d0 Приостановка: 1 Teb: 00000090 bbdf7000 Unfrozen # Child-SP RetAddr : Args to Child : Call Site 00 00000090 bc1ffba8 00007ffa 7cc507b3 : 00000000 0000000000007ff6 1fec2370 0000b408 eb7e3e32 00007ffa 7fa05d78 : Install! TotalUpdCount ':: 2':: деструктор динамического атексита для' svUpdates '' 01 00000090 bc1ffbb0 00007ffa 7cc4ce0b: 00000090 bc1ffd00 00000090 bc1ffc88 00000090 bc1ffd20 00007ffa 7cd25cb: оператор uc (rc):0xc3 02 00000090 bc1ffc10 00007ffa 7cc506e4: 00000090 bc1ffd08 00007ffa 7cd25c80 00000000 00000000 00000090 bc1ffc78: ucrtbase! ____* bc1ffc70: ucrtbase! execute_onexit_table + 0x34 04 00000090 bc1ffc70 00007ffa 7cc4f5ab: 00000000 00000001 00000000 00000000 000001f7 ffffffff 00007ffa 684431a8: ucrtbase! :: оператор () + 0x65 05 00000090 bc1ffcb0 00007ffa 7cc46223: 00000000000000000000000000000000000000000000000000* bc1ffd00: ucrtbase! __crt_seh_guarded_call :: operator () <, & __ptr64,> + 0x3b 06 00000090 bc1ffce0 00007ff6 1fd110b0: 00000000 00000001 00000000 00000000 00000000 00000000 00000000 00000000: база данных ucrtbase!00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000: установить!00000000 00000000 00000000 00000000 00000000: ntdll! RtlUserThreadStart + 0x21

только код, использующий эту статическую переменную:

```TotalUpdCount(list<wchar_t *> &lvUpdates)
{    
list<wchar_t *>::iterator svListIter;
map<wstring,int>::iterator svVecIter;
static map<wstring,int> svUpdates;
static bool svFirst=true;

if(svFirst)
{
    svUpdates.clear();
    svFirstTime=false;
}
for (svListIter = lvUpdates.begin();
    svListIter != lvUpdates.end();
    svListIter++)
{
    wstring svTmpUpdate=*svListIter;
    svVecIter = svUpdates.find(svTmpUpdate);
    if (svVecIter == svUpdates.end())
        svUpdates.insert(make_pair(svTmpUpdate, 1));
}
nvTotalUpdatesCnt = static_cast<int>(svUpdates.size());


...