2010-06-28 3 views
4

У меня есть строковый объект в моей программе C++ объявлен следующим образом:Удаление объекта строки в C++

string str; 

Я скопировал некоторые данные в нее и сделать некоторые операции. Теперь я хочу удалить объект str из памяти. Я не могу использовать оператор delete, так как str не является указателем. Как удалить этот объект из памяти, чтобы вернуть выделенную ему память?

Thanks, Rakesh.

+3

Какова цель? Не хотите «отходов» или что? – sharptooth

ответ

8

Вам не придется. Когда строка выходит из области видимости, ее деструктор будет вызываться автоматически, и память будет освобождена.

Если вы хотите очистить строку прямо сейчас (не дожидаясь, пока она выходит за рамки) просто используйте str.clear().

+0

что делать, если мы не сможем выйти из сферы действия? мы все еще можем контролировать объем динамической памяти, которую он выделяет внутренне, изменяя его содержимое. – newacct

+1

Этот ответ кажется лучшим, если учесть тон сообщения OPs. Бьюсь об заклад, OP ожидает, что строки C++ будут работать как Java или что-то в этом роде, или слышали о том, как сложная память/управление находится на C++, и опасается, что он делает это неправильно. – Omnifarious

+0

Чтение реализации SGI, я не думаю, что 'clear' освобождает память ... но другие реализации могут. – Stephen

8
str.clear(); 

или

str = ""; 

Однако, как говорится в комментарии, это не гарантирует (и, на самом деле, весьма маловероятно) на самом деле вернуть память кучи. Также не гарантируется на работу, но на практике работает достаточно хорошо, это своп трюк:

std::string().swap(str); 

Тем не менее, реализации, использующие оптимизацию небольшой струнный сохранит несколько байт стека (и str сам, конечно, также живет в стеке).

В конце я согласен со всеми комментариями, говоря, что это вызывает сомнения почему вы хотите это сделать. Ass только str выходит из области видимости, его данные будут автоматически удалены в любом случае:

{ 
    std::string str; 

    // work with str 

} // str and its data will be deleted automatically 
+0

Действительно ли строка: clear требуется для установки емкости 0? В противном случае это не повлияет на объем выделенной памяти, и мне кажется, что это то, что хочет. – pmr

+0

Я думаю, что @pmr прав, 'clear' можно использовать для очистки содержимого, но сохранить память. Иногда полезно избегать перераспределения в цикле. – Stephen

+0

@pmr и @Stephen: Спасибо за ваши комментарии. Я попытался исправить свой ответ. – sbi

2

Добавить Дополнительный объем

{ 
    String str; 
    ... 
    ... 
} 

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

1

Теперь я хочу удалить объект str из памяти.

Вы не можете. По крайней мере, вы не можете удалить его полностью. str уже выделена в стеке (или в сегменте кода, если это глобальная переменная), и он не будет полностью исчезать, пока вы не вернетесь из подпрограммы, оставьте область, в которой она была создана (или пока вы не выходите из программы - для глобального переменная).

Вы можете вызвать .clear() или присвоить ему пустую строку, но это не гарантирует освобождение всей памяти. Он гарантирует, что длина строки будет установлена ​​равной нулю, но определенная реализация может решить сохранить часть изначально выделенного буфера (т. Е. Резервный буфер для ускорения будущих операций, например + =).

Честно говоря, если у вас нет очень небольшого количества доступной памяти, я бы не стал беспокоиться. Это очень маленький объект.