2015-03-09 1 views
3

http://en.cppreference.com/w/cpp/io/ostrstream/freezeИспользование станд :: ostrstream :: замораживания после станд :: ostrstream :: ул, чтобы предотвратить утечку памяти

Заметки После вызова к Силе(), динамические потоки застывают автоматически. Перед тем, как выйти из области , в которой был создан этот объект ostrstream, требуется вызвать замораживание (false). в противном случае деструктор будет утечка памяти. Кроме того, дополнительный вывод в замороженный поток может быть усечен, как только он достигнет конца выделенного буфера .

std::string Function(const ObjectA & obj) 
{ 
     std::ostringstream os; 
     os << obj; 

     return os.str(); 
} 

Вопрос> Означает ли это утечка памяти функции из-за недостающим захода std::ostrstream::freeze после str()?

+7

Это тип, использованный другим пользователям. Эта документация предназначена для 'strstream', а не' stringstream'. Я не знаю, было ли это преднамеренно. – chris

+1

Извините, это моя ошибка. Я должен закрыть его, как вы уже указали на ошибку. Спасибо – q0987

+3

Также обратите внимание, что 'strstreams' устарели. – edmz

ответ

2

Стандарт эффективно объясняет (раздел D.7.1.1 и D.7.1.2), что str() устанавливает состояние strstream к замороженным и что strstreambuf::~strstreambuf()

освобождает динамически выделенный объект массива только если strmode & выделено! = 0 и strmode & frozen == 0.

Как ваш strstream (я предполагаю, что это опечатка использовать stringstream здесь, givent ваш вопрос) является локальным объектом, он будет уничтожен, когда вы вернетесь, утечка памяти.

Важное примечание:strstream устарела и хранится в живых только для проблем с совместимостью. Если вы используете stringstream, у вас не будет просачиваться, так как stringstream::str() uses strings

+0

Вау, это очень плохо. –

+0

Да! Я думаю, это причина, по которой это в приложении D (устарело)! – Christophe

+1

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