![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Совершенно типичная задача: метод некоторого объекта возвращает строку описания кода ошибки:
Здесь происходит не очень хорошая вещь: во "вне" выкидывается ссылка на объект области видимости функции strerror(), который может кануть в небытие в скором времени. Ведь так? Или же в данном случае, если полученная строка используется сразу же (до последующих вызовов функций по выделению памяти), то это не критично? Но если писать полностью корректный код, то надо поступать по-честному. Заменить, например, строку ostringstream oss; на ostringstream& oss = *(new ostringstream); (тогда получим висящий объект в куче) или сделать oss членом класса SomeObject... Тогда ситуация разрешится как с методом c_str() у string, который дает const-ссылку на внутренний буфер. А может const - массивы все-равно остаются в стеке даже после выхода из области видимости и можно не париться (э... хотя вряд ли =) )? -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| Fazil6 |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
да. обычно так.
Это сообщение отредактировал(а) Fazil6 - 20.7.2006, 15:22 |
||||
|
|||||
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Fazil6, нда это конечно самый надежный вариант, просто хотелось сохранить семантику стандартного strerror() из <cstddef>
Только тогда уже лучше вот так:
Добавлено @ 15:32 Кстати, strncpy() и так в buf допишет '\0' Это сообщение отредактировал(а) SaDFromSpb - 20.7.2006, 15:45 -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| Fazil6 |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
хм. Чем же это лучше?
кто удалять это будет?
если строка источника больше заданной для копирования, то не добавит Добавлено @ 15:54
можно иметь какие-то константы вне функции и возвращать их |
||||||||
|
|||||||||
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Fazil6,
Лучше тем, что не нужно производить мучительных раздумий, какой же длинны строку передавать в эту функцию. Нет ограничений на длинну строки, и лишняя память не используется. Так программер и будет.
ну да, вернее, если третий параметр больше длины строки назначения, то не добавит. Что-то мы уже здесь немного оффтопим. Добавлено @ 16:00 Ты имеешь ввиду строковые константы? Так у нас же строки формируются внутри функции. Это сообщение отредактировал(а) SaDFromSpb - 20.7.2006, 16:21 -------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| SaDFromSpb |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 5.4.2006 Где: Санкт-Петербург Репутация: 3 Всего: 3 |
Ладно, закрываю эту глупую тему =) .
-------------------- "За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001) |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Сделай этот объект статическим – тогда до следующего обращения к функции SomeObject::strerror твоя строка будет в целости и сохранности. Только не забудь обнулять потоковую строку перед тем как туда что-то записывать (желательно это делать сразу после объявления static ostringstream oss; ). |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |