Ошибка сегментации при использовании std :: map! - PullRequest
1 голос
/ 24 декабря 2011

У меня ошибка сегментации при использовании std::map<std::string, GLuint> (sic!).Там нет видимых указателей (где я мог бы сделать что-то не так) там!Я не знаю, как это возможно.Это не происходит в каждом месте, только в graphical_engine::draw(figure *f) и в нескольких местах больше (я думаю).Ошибка сегментации нападает на меня, когда я пытаюсь сделать что-то вроде: cached["pos"] = 2, cached.begin()->first и т. Д. Но, шаг за шагом:

Во-первых, я должен отметить, что я использую в этом «проекте» C++ 11.Я не знаю, будет ли эта информация полезной, но ...

Я также использую библиотеку SFML, чтобы открыть окно и написать в нем текст.

Я создаю графическое приложениев OpenGL.Я застрял на месте, где я создал своего рода кеш.Я хочу сохранить в кэше индекс атрибута вершины из шейдерной программы.Я просто не хочу «заряжать» его, используя glGetAttribLocation более одного раза (первый раз, когда я звоню glVertexAttribPointer, а второй раз: используйте glEnableVertexAttribArray), поэтому я выбрал «кэширование» в std::map<std::string, GLuint>.

В моем приложении я написал несколько классов, отвечающих за: логику приложения, графику.В графическом классе я объявил вспомогательные типы: shader, shader_program.Я пишу это потому, что когда я звоню s.is_cached("pos") in, например, int main, нет ошибки сегментации.Проблема возникает, когда я пытаюсь вызвать s.is_cached("pos") в моем методе void graphics_engine::draw(figure *f).Затем появляется известная ошибка сегментации, и это не смешно. Реализация

bool shader_program::is_cached(const char *name) выглядит следующим образом:

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;

Если вы не понимаете ни одного моего кода, пожалуйста, оставьте комментарий.

Полный код: http://jackweb.ovh.org/OGL.zip

Чтовызывает ошибку сегментации?

...