Смешивание string и char*
Наиболее распространенное представление строк в Си++ - классические строки Си и класс 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 временный.
July 10th, 2008 at 3:09 pm
std::vector READ_SZ;
…
void some::ReadString(char *buffer)
{
strcpy(buffer,READ_SZ.back().c_str);
}
error: no matching function for call to `strcpy(char*&, )’
July 10th, 2008 at 3:11 pm
strcpy(char*&, [unknown type])
July 10th, 2008 at 3:13 pm
Sorry, ))) forget operator()