Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Удаление строки


Автор: Etud 30.12.2010, 14:03
Удаляется ли строка 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;
}

Автор: KaraKum 30.12.2010, 14:07
Да.
В момент "return s2;" она будет скопирована в возвращаемое значение функции и все данные по значение что были созданы в функции FindUrl (в том числе и s2) будут удалены из памяти (из стека, если быть точнее).

Автор: Etud 30.12.2010, 14:42
Спасибо. С функцией ясно.

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

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

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

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

Добавлено через 40 секунд
Самому его вызывать не надо (нельзя).

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


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

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

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

А зачем тогда ей (s) квалификатор const, если собираетесь модифицировать ее? За вызовом деструктора можно наблюдать, открыв в отладке одно дизассемблера и выполняя пошагово код.

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

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


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


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


Автор: Estranged 30.12.2010, 15:28
А почему она должна удалиться именно в этой функции, в FindUrl?
Когда придет время, вызывающая функция, или вызывающая вызывающую (рекурсия) сама вызовет деструктор в положенном месте.
Передается s через ссылку, а не через копию:
(const std::string & s)

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


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

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


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

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

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

Автор: Estranged 30.12.2010, 15:53
Так уже отвечали: деструктор будет вызван автоматически, руками писать не надо ничего.

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

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

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

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

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

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

delete stringByPointer;

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

Добавлено через 5 минут и 56 секунд
В случае с std::string, если создавать их по значению, можно выполнять ЛЮБЫЕ операции с ними - утечек памяти не будет и ничего самому удалять не нужно.

Автор: Etud 30.12.2010, 17:09
ок, все понял.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)