| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Возвращение const char* |
| Автор: SaDFromSpb 20.7.2006, 15:05 | ||
Совершенно типичная задача: метод некоторого объекта возвращает строку описания кода ошибки:
Здесь происходит не очень хорошая вещь: во "вне" выкидывается ссылка на объект области видимости функции strerror(), который может кануть в небытие в скором времени. Ведь так? Или же в данном случае, если полученная строка используется сразу же (до последующих вызовов функций по выделению памяти), то это не критично? Но если писать полностью корректный код, то надо поступать по-честному. Заменить, например, строку ostringstream oss; на ostringstream& oss = *(new ostringstream); (тогда получим висящий объект в куче) или сделать oss членом класса SomeObject... Тогда ситуация разрешится как с методом c_str() у string, который дает const-ссылку на внутренний буфер. А может const - массивы все-равно остаются в стеке даже после выхода из области видимости и можно не париться (э... хотя вряд ли =) )? |
| Автор: Fazil6 20.7.2006, 15:20 | ||||
да. обычно так.
|
| Автор: SaDFromSpb 20.7.2006, 15:29 | ||
| Fazil6, нда это конечно самый надежный вариант, просто хотелось сохранить семантику стандартного strerror() из <cstddef> Только тогда уже лучше вот так:
Добавлено @ 15:32 Кстати, strncpy() и так в buf допишет '\0' |
| Автор: Fazil6 20.7.2006, 15:46 | ||||||||
хм. Чем же это лучше?
кто удалять это будет?
если строка источника больше заданной для копирования, то не добавит Добавлено @ 15:54
можно иметь какие-то константы вне функции и возвращать их |
| Автор: SaDFromSpb 20.7.2006, 16:36 |
| Ладно, закрываю эту глупую тему =) . |
| Автор: UnrealMan 20.7.2006, 17:25 |
Сделай этот объект статическим – тогда до следующего обращения к функции SomeObject::strerror твоя строка будет в целости и сохранности. Только не забудь обнулять потоковую строку перед тем как туда что-то записывать (желательно это делать сразу после объявления static ostringstream oss; ). |