为什么此代码会因分段错误而停止:
class MapFile
{
public:
/* ... */
std::map <unsigned int, unsigned int> inToOut;
};
bool MapFile::LoadMapFile( const wxString& fileName )
{
/* ... */
inToOut.insert( std::make_pair(input,output) );
}
但当我把“std :: map inToOut;”就在“inToOut.insert”之前,它工作得很好:
class MapFile
{
public:
/* ... */
};
bool MapFile::LoadMapFile( const wxString& fileName )
{
/* ... */
std::map <unsigned int, unsigned int> inToOut;
inToOut.insert( std::make_pair(input,output) );
}
行。谢谢大家,看来我已经解决了这个问题,感谢您的帮助。
问题在于我一直在调用LoadMapFile的代码部分:
void WizardProductPage::OnTestButtonMapFile( wxCommandEvent& event )
{
wxString filename;
filename = locMapFile->GetValue();
MapFile::LoadMapFile( filename );
}
应该是:
void WizardProductPage::OnTestButtonMapFile( wxCommandEvent& event )
{
wxString filename;
filename = locMapFile->GetValue();
MapFile mapFile;
mapFile.LoadMapFile( filename );
}
答案 0 :(得分:3)
我猜你的问题出在其他地方。以下代码可以正常工作:
class MapFile
{
public:
std::map <unsigned int, unsigned int> inToOut;
void LoadMapFile();
};
void MapFile::LoadMapFile()
{
inToOut.insert( std::make_pair(1, 1) );
}
int main() {
MapFile a;
a.LoadMapFile();
return 0;
}
尝试逐步调试或在此发布您的整个代码,因为这没有任何问题。
还有,是的。如果您试图在不锁定的情况下同时从不同的线程执行该操作,则可能会导致段错误。
答案 1 :(得分:2)
很可能你有一个缓冲区溢出或一个错误的指针,当你是一个类的成员时,它会导致你删除地图。当你有一个自动变量的类时,它就在内存中的其他地方,而你原来的bug就会破坏其他一些内存。
您应该在内存调试器下运行代码。如果你在Linux上,我会推荐Valgrind
答案 2 :(得分:1)
也许您的应用程序是多线程的,并且您没有将插入锁定到map
。第二个变体不与其他线程共享map
。
答案 3 :(得分:1)
您可能在已删除的对象上调用了成员函数。
例如
MapFile *p;
{
MapFile a;
p = &a;
}
p->LoadMapFile("test.map");
会产生您描述的错误。第二种情况不会,因为您不会在任何时候取消引用this
指针。
编辑:也许不是,如果输入,输出变量是成员数据,那么我的回答是不正确的。
答案 4 :(得分:1)
出现这种问题的其他原因可能是使用带有自定义比较器和/或分配器的地图而不是相应地初始化地图,这可能会在任何随机点产生分段错误,即:第一个插入可以完美地工作,但是在第二个,当调用比较函数时,可能存在分段错误。