Рассмотрим следующую программу C ++:
#include <cstdlib> // for exit(3)
#include <string>
#include <iostream>
using namespace std;
void die()
{
exit(0);
}
int main()
{
string s("Hello, World!");
cout << s << endl;
die();
}
Выполнение этого через valgrind показывает следующее (некоторые выходные данные обрезаны для краткости):
==1643== HEAP SUMMARY:
==1643== in use at exit: 26 bytes in 1 blocks
==1643== total heap usage: 1 allocs, 0 frees, 26 bytes allocated
==1643==
==1643== LEAK SUMMARY:
==1643== definitely lost: 0 bytes in 0 blocks
==1643== indirectly lost: 0 bytes in 0 blocks
==1643== possibly lost: 26 bytes in 1 blocks
==1643== still reachable: 0 bytes in 0 blocks
==1643== suppressed: 0 bytes in 0 blocks
Как вы можете видеть, существует вероятность , что 26 байт выделенные в куче были потеряны. Я знаю, что класс std :: string
имеет 12-байтовую структуру (по крайней мере, в моей 32-битной архитектуре x86 и компиляторе GNU 4.2.4) и "Hello, World!" с нулевым терминатором имеет 14 байтов. Если я правильно понимаю, 12-байтовая структура содержит указатель на символьную строку, выделенный размер и счетчик ссылок (кто-нибудь поправит меня, если я ошибаюсь).
Теперь мои вопросы: как обстоят дела со строками C ++ хранится относительно стека / кучи? Существует ли объект стека для std :: string
(или других контейнеров STL) при объявлении?
PS I ' Мы где-то читали, что valgrind может сообщать о ложном срабатывании утечки памяти в некоторых программах C ++, которые используют контейнеры STL (и «почти контейнеры», такие как std :: string
). Меня не слишком беспокоит эта утечка, но она вызывает мое любопытство относительно контейнеров STL и управления памятью.