Наиболее распространенное представление строк в Си++ - классические строки Си и класс string из STL. Каждое представление удобно по своему - string обеспечивает автоматическое выделение памяти, перегрузку операторов и освобождение буфера в деструкторе. char* не содержит никаких довесок влияющих на производительность, но не предоставляет абсолютно никакого контроля над данными - выделение памяти, освобождение надо делать руками. Зато можно написать более эфективно, чем реализовано в строковом классе(особенно если не надо обеспечивать общность и избыточную функциональность). Иногда эти две сущности приходится смешивать. Тогда могут начаться неприятности.
Класс string имеет метод
const char* string::c_str(void)
который возвращает указатель на традиционное представление строки в виде Си. Если у вас обьект временный, то при выходе из соответствующего блока указатель станет недействительным и могут начаться проблемы - от краха проги до вообще непонятных вещей.
В любом случае, следите за временем жизни обьектов и не допускайте использования ссылок на уничтоженные обьекты.
Типичная ошибка выглядит примерно так :
void some::addToList(const string& name) {
storage.push_back(name.c_str());
}
при вызове
x.addToList(”YYYY”);
в хранилище появится ссылка на не несуществующий обьект, поскольку string name временный.
Copyright 2008 - ТолиБлог
Powered by WordPress - Web hosting Services by Wordpress Theme, Archived by WPT
Оставьте отзыв