необработанное исключение в msvcr100d.dll

0

Я получил необработанную ошибку исключения во время выполнения при использовании следующего кода C++, вы можете следить за ошибкой с помощью отладки с помощью Visual Studio. Почему это исключение произойдет, можете ли вы это объяснить?

Сначала я определяю класс с менверной переменной "_name"

void insert_Fenster(int pos,wstring name);
wstring get_Fenster_name(int pos);

class Fenster
{
public:
    Fenster(wstring name)
        :_name(name)
    {}

    void reload()
    {
        _name;
        insert_Fenster(1,L"temp");
        wstring tmp = get_Fenster_name(1);
        _name = tmp; //ERROR!!!
    }

    wstring get_name()
    {
        return _name;
    }

private:
    wstring _name;
};

Во-вторых, я определяю класс для хранения карты класса

class FensterManager
{
public:
    bool has(int pos)
    {
        if (_mapFenster.find(pos)!=_mapFenster.end())
            return true;
        else
            return false;
    }

    void insert(int pos,wstring name)
    {
        if (has(pos))
        {
            _mapFenster.erase(pos);
        }
        _mapFenster.insert(make_pair(pos,Fenster(name)));
    }

    Fenster& get_Fenster(int pos)
    {
        return _mapFenster.at(pos);
    }

private:
    static map<int,Fenster> _mapFenster;
};

И некоторые функции использования

void insert_Fenster(int pos,wstring name)
{
    FensterManager fm;
    fm.insert(pos,name);
}

void reload_Fenster(int pos)
{
    FensterManager fm;
    if (fm.has(pos))
        fm.get_Fenster(pos).reload();
}

wstring get_Fenster_name(int pos)
{
    wstring name;

    FensterManager fm;
    if (fm.has(pos))
        name = fm.get_Fenster(pos).get_name();

    return name;
}

//Init of static member before main function
map<int,Fenster> FensterManager::_mapFenster;

это основная функция

void main()
{
    insert_Fenster(1,L"xyz");
    reload_Fenster(1);
}

Исключение происходит при "перезагрузке" функции в классе "Fenster".

С сообщением об ошибке: Необработанное исключение в 0x005cca34 (msvcr100d.dll) в Regular_Expression.exe: 0xC0000005: место записи нарушения прав доступа 0xfeeefeee.

Теги:

3 ответа

3
Лучший ответ

Когда вы вызываете reload_Fenster(1); , он вызовет Fenster::reload. В этой функции вы вызываете insert_Fenster(1,L"temp"); , FensterManager::insert сначала FensterManager::insert позицию 1 с карты. Поэтому, когда вы вернетесь в Fenster::reload, экземпляр был удален. Как только вы попытаетесь получить доступ к _name, вы попытаетесь получить доступ к памяти, которая была удалена.

изменить: уточнить; этот вызов функции:

fm.get_Fenster(pos).reload();

сначала вызовет fm.get_Fenster(pos) а затем вызовет reload() в результате. Если fm.get_Fenster(pos) изменяется в функции reload(), выполнение не будет перемещать новый Fenster, но старый будет продолжать выполнение. Даже если вы удалите старый Fenster.

Вы должны убедиться, что не удаляете экземпляр, если вы все еще выполняете внутри него функции. Это приведет к сбою приложения, как только вы попытаетесь получить доступ к элементам, потому что они хранятся в памяти, которая была удалена.

  • 0
    Этот ответ кажется точным.
  • 0
    но после стирания он также вставляет позицию 1 на карту _mapFenster.insert(make_pair(pos,Fenster(name)));
Показать ещё 3 комментария
0

выглядит как-то внутри void insert_Fenster(int pos,wstring name); - Посмотрите вверх по стеку вызовов, и вы увидите, какая часть вашего кода вызывается в dll runtime. Это будет ошибка.

  • 0
    почему будет insert_Fenster ?
0

Можете ли вы предоставить дополнительную информацию о необработанном исключении.

В приведенном выше коде есть одна очевидная ошибка. Insert_Fenster вставляет в экземпляр FensterManager, и reload_Fenster пытается перезагрузить из другого экземпляра FensterManager, который является неправильным.

void main()
{
    FensterManager fm;
    insert_Fenster(fm, 1,L"xyz");
    reload_Fenster(fm, 1);
}

Метод вставки и перезагрузки должен быть обновлен следующим образом:

void insert_Fenster(FensterManager &fm, int pos,wstring name)
{
    fm.insert(pos,name);
}

void reload_Fenster(FensterManager &fm, int pos)
{
    if (fm.has(pos))
        fm.get_Fenster(pos).reload();
}
  • 1
    Да, но по какой-то безумной причине данные статичны: static map<int,Fenster> _mapFenster; Конечно, твой путь лучше, но я не верю, что это проблема. Я также не верю коду в виде опубликованных компиляций.
  • 1
    да, это другой экземпляр, но оба содержат один и тот же статический член
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню