Итак, я знаю, что это было отвечено уже, но я видел ваш комментарий в ответ преторианской в:
Это ошибка драйвера OpenGL, что приводит возвращаемое значение для строки максимальная длина была нарушена. См. https://forums.geforce.com/default/topic/531732/glgetactiveattrib-invalid/. glGetActiveAttrib не будет пытаться писать указателю, возвращенному новым вызовом [] с распределением размера 0, но строка не равна нулю. завершено. Затем, позже в коде, строка, отличная от нуля, равна , скопированной в std :: string для хранения, что приводит к переполнению буфера чтения . Очень смущает меня и просто проверяет, может ли std :: string облегчить выполнение.
Эмм ... простите меня, но если это ваша проблема, то все эти решения кажутся слишком сложными.Если проблема сводится к тому, что вы получаете 0 в качестве необходимого размера буфера (это означает, что вы закончите строку, которая не завершена NULL, так как нет места для терминатора NULL), тогда просто убедитесь, что пустое значение терминатор всегда присутствует:
int arraySize;
/* assume arraySize is set to the length we need */
...
/* overallocate by 1 to add an explicit NULL terminator. Just in case. */
char *ptr = malloc(arraySize + 1);
if(ptr != NULL)
{
/* zero out the chunk of memory we got */
memset(ptr, 0, arraySize + 1);
/* call OpenGL function */
cStyleAPI(ptr, arraySize);
/* behold, even if arraySize is 0 because of OpenGL, ptr is still NULL-terminated */
assert(ptr[arraySize] == 0);
/* use it */
...
/* lose it */
free(ptr);
}
Это, кажется, мне, чтобы быть самым простым, здравомыслящим решением.
c_str() возвращает const char *, и мне нужно иметь возможность получать вывод в строку. Можно ли это сделать без использования const_cast и c_str()? – masrtis
@masrtis Нет, это все еще не так, но тогда почему бы вам не использовать 'char buf [BUFSIZE]'? – 2013-05-07 17:49:02
@masrtis Ну, практически на самых разумных условиях? Да! Но теоретически гарантируется стандартом? Точно нет! –