Зависит от короткой или длинной строки:
std::string a_string = a + a;
// reassign a new string to a_string
a_string = b + b + b;
Во-первых, a + a создается непосредственно как a_string из-за гарантированной копии elison (c ++ 17). Здесь не происходит освобождения.
Затем, если a_string
достаточно короткий, он размещается в стеке без дополнительных распределений кучи. Эта оптимизация коротких строк (SSO) выполняется большинством компиляторов, но не обязана стандартом.
Если произошел SSO, это не освобождает место в a_string, а просто использует его повторно. Память уходит в никуда:
a_string = b + b + b;
Однако, если a_string слишком длинен для единого входа, эта строка освобождает пространство кучи, выделенное для строки.
Ясно видеть, куда уходит память, когда проверяется объявление std::string
:
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
Память строки без SSO выделяется и освобождается с помощью std::allocator
. Этот распределитель выделяет и освобождает память с помощью операторов new
и delete
. Обычно они используют malloc / free за кулисами. Так работает malloc и free.
Легко узнать, насколько большой может быть строка SSO, запустив
std::cout << std::string().capacity() << '\n';
Для clang 8.0.0 на 64-битном Intel SSO - для строк длиной до 22 символов, а для gcc 8.3 - только 15 символов.