У меня ошибка сегментации при использовании 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
Чтовызывает ошибку сегментации?