> Возвращение по ссылке std::vector
Stas
Отправлено: 31 января 2013 в 10:46
Post Id
cообщений: 14 пользователь offline

Здравствуйте!
Я на днях нашел такой пример разбивающий строки по определенному делителю:

std::vector<std::string> &split(const std::string &s, char delim) 
{
    std::vector<std::string> elems;    // создаётся объект

    std::stringstream ss(s);
    std::string item;

    while(std::getline(ss, item, delim)) 
    {
        elems.push_back(item);
    }
    return elems; // этот же объект возвращается  по ссылке
}

Но на сколько я знаю если в функции создать объект не через команду new, то объект создастся в стеке и будет удален при выходе из функции.
Если же это корректный код, объясните мне по какой схеме работает деструктор у вектора.
Заранее спасибо! ))

Обновлено: 31 января 2013 в 11:51
 Top
Aceton
Отправлено: 31 января 2013 в 12:08
Post Id
cообщений: 155 администратор offline

В принципе код корректный и будет работать, но не правильно. Бессмысленно возвращать указатель на автоматический объект, созданный в этой функции - он будет удалён по выходу из этой функции и указатель автоматом станет невалидным. Т.е. по этому адресу, на который указывает указатель могут лежать уже совсем другие данные....

Поидее нужно так переписать

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) 
{
    std::stringstream ss(s);
    std::string item;
    while(std::getline(ss, item, delim)) 
    {
        elems.push_back(item);
    }
    return elems;
}
 Top
Stas
Отправлено: 31 января 2013 в 12:16
Post Id
cообщений: 14 пользователь offline

Спасибо.
Просто умные люди написали такой код. По этому и думал, что может я ошибаюсь.

 Top
Aceton
Отправлено: 31 января 2013 в 12:24
Post Id
cообщений: 155 администратор offline

Твой код будет тоже работать, но через раз...

Фактичекси по выходу из ф-ции данные по адресу не уничтожаются, а помечаются как свободный адрес. Получается данные результата работы функции будут лежать по этому адресу, пока какая либо другая программа не перезапишет туда свои. Как то так...

Обновлено: 31 января 2013 в 12:25
 Top
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
 



Новые сообщения