Возможная утечка памяти с использованием строки C ++

Рассмотрим следующую программу 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 и управления памятью.

10
задан pr1268 22 November 2010 в 21:13
поделиться