Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Битая память ostringstream::str().c_str()


Автор: MastEdm 20.5.2008, 11:55
Добрый день. 

Проблема вот в чём:

Код

std::ostringstream os;
os << "Bla-bla-bla";

std::cout << os.str(); // Печатается строка

const char* p = os.str().c_str();
std::cout << strlen(p); // Печатается 0 !?!?!


То есть p указывает на область памяти с нулём вначале. Ясно, что бага где-то в либе. Чем лечить?


Автор: maxim1000 20.5.2008, 12:04
метод str возвращает временный объект std::string (не ссылку на что-то внутри себя)
потом у него берётся адрес буфера
потом обработка выражения заканчивается, и временный объект удаляется, взятый адрес становится некорректным

для того, чтобы доступаться к внутреннему буферу строки, нужно, как минимум, гарантировать её существование в течение всего времени использования этого адреса

Автор: Lazin 20.5.2008, 12:16
Код

std::ostringstream os;
os << "Bla-bla-bla";
std::cout << os.str(); // Печатается строка
const std::string p = os.str();
std::cout << strlen( p.c_str() ); // Не Печатается 0 )))

Автор: Rififi 20.5.2008, 12:18
Цитата
Ясно, что бага где-то в либе

мысль что бага где-то в коде даже не допускается :gigi:

Автор: MastEdm 20.5.2008, 14:46
Цитата(Rififi @ 20.5.2008,  12:18)
Цитата
Ясно, что бага где-то в либе

мысль что бага где-то в коде даже не допускается :gigi:

Обхохочешься...

Автор: JackYF 20.5.2008, 15:43
Модератор: не переходим на личности!

MastEdm, насчёт "ясно, что бага в либе" ты всё-таки переборщил. На этом флейм заканчиваем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)