std::map插入导致分段错误

3
为什么这段代码会停在分段错误处:
class MapFile
{
 public:
   /* ... */
   std::map <unsigned int, unsigned int> inToOut;
};

bool MapFile::LoadMapFile( const wxString& fileName )
{
    /* ... */
   inToOut.insert( std::make_pair(input,output) );
}

但是当我在“inToOut.insert”之前加入“std::map inToOut;”时,它就可以正常工作:

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 );
}

调试器告诉你什么? - James McNellis
5个回答

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;
}

尝试逐步调试或在此处发布您的整个代码,因为其中没有问题。

另外,是的。如果您尝试在不锁定的情况下同时从不同线程执行该操作,可能会导致段错误。


好的。谢谢。我会看一下的。这段代码太长了,无法在此粘贴。 - Jakub Czaplicki
是的,你说得对。我之前写成了MapFile::LoadMapFile( filename ); 而不是 MapFile a; a.LoadMapFile(); 现在看来我的问题已经解决了。 - Jakub Czaplicki

2
很可能你有一个缓冲区溢出或一个坏的指针,导致你在类成员中崩溃了地图。当你把类作为自动变量时,它在内存中的位置是不同的,你最初的错误会破坏其他一些内存。
你应该在内存调试器下运行你的代码。如果你在Linux上,我建议使用Valgrind

1

你可能在已经被释放的对象上调用了成员函数。

例如:

MapFile *p;
{
  MapFile a;
  p = &a;
}

p->LoadMapFile("test.map");

会产生你所描述的错误。第二种情况不会出错,因为您在任何时候都没有取消引用this指针。

编辑: 也许不会,在输入、输出变量是成员数据的情况下,我的答案可能是不正确的。


1

也许你的应用程序是多线程的,而你没有锁定对 map 的插入操作。第二种变体不与其他线程共享 map


1

这种问题的另一个原因可能是使用具有自定义比较器和/或分配器的映射,并且未相应地初始化映射,这可能在任意随机点生成分段错误,即:第一次插入可能完美地工作,但在第二次插入时,当调用比较函数时,可能会发生分段错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接