C++ 使用std::map时出现分段错误!

C++ 使用std::map时出现分段错误!,c++,stl,map,segmentation-fault,c++11,C++,Stl,Map,Segmentation Fault,C++11,使用std::map sic!时出现分段错误!。那里没有我可以做错事的可见指针!我不知道这怎么可能。它不会出现在每个地方,只会出现在图形引擎::drawfigure*f中,我认为还有一些地方会出现。当我尝试执行以下操作时,分段错误会攻击我:cached[pos]=2,cached.begin->first等。。但是,一步一步: 首先我必须注意,我在这个“项目”中使用了C++11。我不知道这些信息是否有用,但是 我还使用SFML库打开一个窗口并在其中写入文本 我正在OpenGL中创建一些图形应用程

使用std::map sic!时出现分段错误!。那里没有我可以做错事的可见指针!我不知道这怎么可能。它不会出现在每个地方,只会出现在图形引擎::drawfigure*f中,我认为还有一些地方会出现。当我尝试执行以下操作时,分段错误会攻击我:cached[pos]=2,cached.begin->first等。。但是,一步一步:

首先我必须注意,我在这个“项目”中使用了C++11。我不知道这些信息是否有用,但是

我还使用SFML库打开一个窗口并在其中写入文本

我正在OpenGL中创建一些图形应用程序。我被困在我创建了一种缓存的地方。我想在缓存中存储来自着色器程序的顶点属性索引。我只是不想在第一次调用GLVertexAttributePointer和第二次调用GLVertexAttributeArray时使用GLGetAttributeLocation多次“充电”,所以我选择在std::map中“缓存”它

在我的应用程序中,我编写了几个类负责:应用程序逻辑、图形。在图形类中,我声明了辅助类型:着色器、着色器和程序。我写它是因为当我在中调用s.is_cachedpos时,例如int main,没有分段错误。当我尝试在我的方法void graphics_engine::drawfigure*f中调用s.is_cachedpos时,问题出现了。然后出现了著名的分割错误,这并不好笑

bool shader_program::is_cachedconst char*名称实现如下所示:

bool shader_program::is_cached(const char *name)
{
  std::string attrname = name;

  // p like 'pair'
  for(auto p: cached)
  {
    if(p.first == attrname) return true;
  }
  return false;
}
编译器g++-std=c++0x,带有-g-D_GLIBCXX_DEBUG选项,生成与我的gdb交互的代码,并返回

__gnu_debug::_Safe_sequence_base::_M_attach_single (this=0xb7b805c9, 
    __it=0xbffff478, __constant=false)
    at ../../.././libstdc++-v3/src/debug.cc:274
274       __it->_M_next->_M_prior = __it;
如果你不理解我的任何代码,请发表评论

完整代码:


分段错误的原因是什么?

还没有读过代码,但是当is_cached在其上迭代时,是否有任何方法可以更改缓存?@Chris Wong:首先,感谢您的回答。否-is_cached不修改cached,并且在每次迭代时,都会创建新的cached.begin。为什么不使用return cached.findname!=是否缓存了“”的cached.end?std::map是一个按键排序的容器,它比简单的迭代要快。你能做一个将代码提取到问题核心的程序吗?我阅读了你的部分程序,发现:logical_engine::logical_engine…:。。。{graphical_engine::shader sGL_VERTEX_shader;…basic_sp.attachs;}这将在basic_sp中挂起对已销毁变量的引用,这将导致SEGFULTS。现在,它不太可能在std::map中导致segfaults,这是我一直在寻找的悬空变量,但是您可能在map中犯了同样的错误。看看这个。如果你找不到,就听从阿伍德兰德的建议。