在使用以下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;
};
一些util函数
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”类中的“reload”函数。
有错误消息: Regular_Expression.exe中0x005cca34(msvcr100d.dll)的未处理异常:0xC0000005:访问冲突写入位置0xfeeefeee。
答案 0 :(得分: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将继续执行。即使你删除旧的Fenster。
如果您仍然在其中运行函数,则应确保不删除实例。一旦您尝试访问成员,它就会使应用程序崩溃,因为它们存储在已删除的内存中。
答案 1 :(得分:0)
看起来像void insert_Fenster(int pos,wstring name);
里面的东西 - 进一步查看调用堆栈,你会看到代码的哪一部分正在调用运行时dll。那将是错误。
答案 2 :(得分: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();
}