Смешивание 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 временный.



Digital Ocean
Провайдер облачного хостинга - заведи свой виртуальный сервер всего за $5 в месяц !

317 Comments

  1. Alexey

    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*&, )’

  2. Alexey

    strcpy(char*&, [unknown type])

  3. Alexey

    Sorry, ))) forget operator()

Leave a Reply