Я понял, что OP старый, но хотел добавить некоторую точность. Я нашел этот пост, когда пытался понять поведение, которое, как представляется, противоречило приведенным здесь ответам.
С помощью gcc4.8.3 clear () может показаться, что он освобождает память в каком-то сценарии.
std::string local("this is a test");
std::cout << "Before clear: " << local.capacity() << '\n';
local.clear();
std::cout << "After clear: " << local.capacity() << '\n';
Как и ожидалось, я получаю
Before clear: 14
After clear: 14
Теперь добавьте еще одну строку в микс:
std::string local("this is a test");
std::string ref(local); // created from a ref to local
std::cout << "Before clear: " << local.capacity() << '\n';
local.clear();
std::cout << "After clear: " << local.capacity() << '\n';
На этот раз я получаю:
Before clear: 14
After clear: 0
Похоже, что stdc ++ имеет некоторую оптимизацию, когда это возможно, совместно использовать память, содержащую строковое содержимое. В зависимости от того, является ли строка общей или нет, поведение будет отличаться. В последнем примере, когда вызывается clear (), создается новый экземпляр внутреннего локального файла std :: string и он будет пустым (). Емкость будет установлена равной 0. Из вывода функции capacity () можно сделать вывод, что некоторая память была освобождена, но это не так.
Это можно доказать с помощью следующего кода:
std::string local("this is a test");
std::string ref(local); // created from a ref to local
std::cout << (int*)local.data() << ' ' << (int*)ref.data() << '\n';
Дает:
0x84668cc 0x84668cc
Две строки указывают на одни и те же данные, я не рассматривал это. Добавьте local.clear () или что-нибудь, что изменяет местный или ref, и, следовательно, адреса будут отличаться.
С уважением
Из моего файла справки Delphi 7:
Дополнительное хранимое, по умолчанию и Директивы NODEFAULT называются Спецификаторы хранения. У них нет влияние на поведение программы, но контролировать, следует ли сохранить Значения опубликованных свойств в форме файлы.
ДОЛЖЕН ДОЛЖЕН ДОЛЖЕН ДОЛЖЕН Правда, ложно, имя логического поле или имя параметра Метод, который возвращает логическое значение. Например,
Имя свойства: TComponentname Чтение FNAME Написание SETNAME сохранено false;
Если недвижимость не имеет сохраненной директивы, это лечится так, как будто сохранены истины указан.
Это звучит, как он контролирует, следует ли хранить свойство, относящееся к компоненту в файле .dfm для формы. (Просто думаю, хотя)
Это ключевое слово определяет, следует ли сохранять значение свойства в файле форм; По умолчанию это
по умолчанию. Это может быть полезно избегать, например, сохранение больших кусочков двоичной информации в вашем файле .dfm
(например, компонент изображения, который должен прочитать его содержимое только во время выполнения.)