Наиболее распространенное представление строк в Си++ - классические строки Си и класс 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 временный.