Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление строки, std::string 
V
    Опции темы
Etud
Дата 30.12.2010, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.11.2007

Репутация: нет
Всего: нет



Удаляется ли строка s2 из памяти при вызове функции:

Код

std::string FindUrl(const std::string& s)
{
    std::string s2;
    
    //1 - Поиск
    std::string::size_type ind = s.find("infa");
    if (ind != std::string::npos)
    {
        //2 - Поиск, получение подстроки
        std::string::size_type ind2 = s.find("infa2", ind);
        s2 = s.substr(ind2);  // вырезать

    }

    return s2;
}

PM MAIL   Вверх
KaraKum
Дата 30.12.2010, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Да.
В момент "return s2;" она будет скопирована в возвращаемое значение функции и все данные по значение что были созданы в функции FindUrl (в том числе и s2) будут удалены из памяти (из стека, если быть точнее).
PM MAIL WWW   Вверх
Etud
Дата 30.12.2010, 14:42 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.11.2007

Репутация: нет
Всего: нет



Спасибо. С функцией ясно.

Но основную строку после работы надо удалить, вызвав деструктор.

Есть по разному
1) s.~basic_string();
2) s.~string();

1-й вариант всегда пашет, а вот с 2-м не совсем ясно.
PM MAIL   Вверх
KaraKum
Дата 30.12.2010, 14:43 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Деструктор будет вызван автоматически при выходе из функции.

Добавлено через 40 секунд
Самому его вызывать не надо (нельзя).
PM MAIL WWW   Вверх
Etud
Дата 30.12.2010, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.11.2007

Репутация: нет
Всего: нет



Цитата(KaraKum @  30.12.2010,  14:43 Найти цитируемый пост)
Деструктор будет вызван автоматически при выходе из функции.


Я про удаление основной строки (s), переданной в функцию.
Она используется ранее.

Про строку s2 прояснили.

Это сообщение отредактировал(а) Etud - 30.12.2010, 15:03
PM MAIL   Вверх
Estranged
Дата 30.12.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: нет
Всего: 3



Цитата(Etud @  30.12.2010,  14:42 Найти цитируемый пост)
Но основную строку после работы надо удалить, вызвав деструктор.

А зачем тогда ей (s) квалификатор const, если собираетесь модифицировать ее? За вызовом деструктора можно наблюдать, открыв в отладке одно дизассемблера и выполняя пошагово код.
PM MAIL   Вверх
Etud
Дата 30.12.2010, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.11.2007

Репутация: нет
Всего: нет



Суть:
После выполнения функцией своей задачи, строка занимает в памяти место.

Её же надо удалить !


Цитата(Estranged @  30.12.2010,  15:04 Найти цитируемый пост)
А зачем тогда ей (s) квалификатор const, если собираетесь модифицировать ее?


Вы предлагаете ее не удалять ?


PM MAIL   Вверх
Estranged
Дата 30.12.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: нет
Всего: 3



А почему она должна удалиться именно в этой функции, в FindUrl?
Когда придет время, вызывающая функция, или вызывающая вызывающую (рекурсия) сама вызовет деструктор в положенном месте.
Передается s через ссылку, а не через копию:
(const std::string & s)
PM MAIL   Вверх
Etud
Дата 30.12.2010, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.11.2007

Репутация: нет
Всего: нет



Цитата(Estranged @  30.12.2010,  15:28 Найти цитируемый пост)
А почему она должна удалиться именно в этой функции, в FindUrl?


А, мы не поняли друг друга !

Не именно в этой функции, а основном коде.


ВОПРОС ПРО ДЕСТРУКТОРЫ В СИЛЕ

Есть по разному
1) s.~basic_string();
2) s.~string();

1-й вариант всегда пашет, а вот с 2-м не совсем ясно.

Это сообщение отредактировал(а) Etud - 30.12.2010, 15:37
PM MAIL   Вверх
Estranged
Дата 30.12.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: нет
Всего: 3



Так уже отвечали: деструктор будет вызван автоматически, руками писать не надо ничего.
PM MAIL   Вверх
KaraKum
Дата 30.12.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 640
Регистрация: 3.12.2007

Репутация: нет
Всего: 1



Я повторюсь: деструктор НИКОГДА нельзя вызывать вручную.

Добавлено через 4 минуты и 14 секунд
Если объект (любой - в нашем частном случае это std::string) создан по значению:
Код

std::string stringByValue = "Hello, C++!";

то деструктор объекта будет вызван автоматически когда придёт время.
А если объект создан по указателю:
Код

std::string *stringByPointer = new std::string("Hello, dynamic C++!");

то деструктор будет вызван именно в момент
Код

delete stringByPointer;

и нигде и никогда более.

Добавлено через 5 минут и 56 секунд
В случае с std::string, если создавать их по значению, можно выполнять ЛЮБЫЕ операции с ними - утечек памяти не будет и ничего самому удалять не нужно.
PM MAIL WWW   Вверх
Etud
Дата 30.12.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 9.11.2007

Репутация: нет
Всего: нет



ок, все понял.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0743 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.