2015-12-24 3 views
0

Я использую stringstream для получения содержимого текстового файла (на самом деле это источник шейдерного кода), чтобы передать его функции, которая принимает const char * const * (glShaderSource). Во-первых, я сделал этоТот же адрес, но различный контент

std::stringstream buffer; 
buffer << input.rdbuf(); 

char const *code = buffer.str().c_str(); 
glShaderSource(id, 1, &code, 0); 

Это не сработало, по той причине, что содержание кода было не то, что ожидалось. На самом деле, если я делаю это:

std::stringstream buffer; 
buffer << input.rdbuf(); 

char const *code = buffer.str().c_str(); 

printf("Code*: %p\n", code); 
printf("Buff*: %p\n", buffer.str().c_str()); 

printf("Code0: %c\n", code[0]); // ERROR: prints garbage. 
printf("Buff0: %c\n", buffer.str().c_str()[0]); 

printf("Code1*: %p\n", &code[1]); // ERROR: prints garbage. 
printf("Buff1*: %p\n", &buffer.str().c_str()[1]); 

printf("Code1: %c\n", code[1]); 
printf("Buff1: %c\n", buffer.str().c_str()[1]); 

я получаю те же выходы для значений указателей, правильные выходы для символов в буфере, но случайные из них для содержания кода.

Теперь, если я использую такую ​​функцию:

void workaround(char const *code) { 
    printf("Code*: %p\n", code); 
    printf("Code: %s\n", code); 
} 

------------------------------------- 

std::stringstream buffer; 
buffer << input.rdbuf(); 

workaround(buffer.str().c_str()); 

printf("Buff*: %p\n", buffer.str().c_str()); 
printf("Buff: %s\n", buffer.str().c_str()); 

Я получаю правильные значения для указателей и содержимого строки.

Почему этот код работает, а не первый?

+1

Вы можете уточнить смешные/неожиданное? –

+1

Не удалось дублировать: http://ideone.com/9G45jT – PaulMcKenzie

+2

Не ставьте решение в вопрос, опубликуйте его как ответ. – Barmar

ответ

2

Я нашел проблему: строка, возвращаемая std :: stringstream, является временной и действительна только до конца выражения.

Чтобы расширить продолжительность действия buffer.str(), можно создать ссылку на объект. Продолжительность жизни значения будет увеличена до одной из эталонных.

Следующий код работает:

std::string const &string = buffer.str(); 
char const *code = string.c_str(); 
glShaderSource(id, 1, &code, 0); 
Смежные вопросы