std :: map插入分段错误

时间:2010-05-30 20:59:17

标签: c++ stl

为什么此代码会因分段错误而停止:

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

5 个答案:

答案 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)

出现这种问题的其他原因可能是使用带有自定义比较器和/或分配器的地图而不是相应地初始化地图,这可能会在任何随机点产生分段错误,即:第一个插入可以完美地工作,但是在第二个,当调用比较函数时,可能存在分段错误。