0

使用以下 C++ 代码时,我在运行时遇到未处理的异常错误,您可以使用 Visual Studio 调试错误。为什么会出现这个异常,能解释一下吗?

首先我定义了一个带有menber变量“_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”类中的“重新加载”函数中。

带有错误消息:Regular_Expression.exe 中 0x005cca34 (msvcr100d.dll) 处的未处理异常:0xC0000005:访问冲突写入位置 0xfeeefeee。

4

3 回答 3

3

当你打电话时reload_Fenster(1);,它会打电话Fenster::reload。在你调用的那个函数中insert_Fenster(1,L"temp");FensterManager::insert将首先从地图中删除位置 1。因此,当您返回时Fenster::reload,该实例已被删除。一旦您尝试访问_name,您就会尝试访问已被删除的内存。

编辑: 澄清;这个函数调用:

fm.get_Fenster(pos).reload();

将首先调用fm.get_Fenster(pos),然后调用reload()结果。如果函数fm.get_Fenster(pos)发生变化reload(),执行不会移动新的 Fenster,但旧的会继续执行。即使你删除了旧的 Fenster。

如果您仍在其中运行函数,则应确保不要删除实例。一旦您尝试访问成员,它将使应用程序崩溃,因为它们存储在已被删除的内存中。

于 2013-10-11T09:54:35.057 回答
0

看起来像里面void insert_Fenster(int pos,wstring name);的东西 - 进一步查看调用堆栈,您会看到代码的哪一部分正在调用运行时 dll。那将是错误。

于 2013-10-11T09:42:01.460 回答
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();
}
于 2013-10-11T09:43:39.357 回答