Использование постоянного символьного указателя в контейнере std :: set: потребление памяти - PullRequest
1 голос
/ 20 февраля 2011

В настоящее время я работаю на устройстве с очень небольшим объемом памяти (4 МБ), и у меня есть компонент моей программы, который требует std :: set. Я хотел бы перенести этот набор с использования std :: string на использование указателей const char, но мне было интересно, как выделяется память для постоянных символьных указателей при использовании в std :: set.

Будет ли освобождена память, выделенная для каждой записи в std :: set, когда указатель будет удален из набора (с помощью .clear () или выйдет из области видимости), или строковый литерал останется в памяти до тех пор, пока конец выполнения программы?

Большое спасибо за вашу помощь. :)

Ответы [ 2 ]

1 голос
/ 20 февраля 2011

Короче, ничего особенного не произойдет.

Удаление структуры, содержащей указатель на некоторую память, освободит только память, используемую самим указателем ; это не приведет к тому, что что-то случится с указанной памятью.

Если, конечно, вы явно не наберете free / delete. Что не очень хорошая идея в случае строковых литералов!

0 голосов
/ 20 февраля 2011

Контейнеры STL всегда запрашивают деструкторы по умолчанию для элементов, которые они содержат, когда очищаются.Для набора, содержащего необработанные указатели 'char *', это ничего не изменит, и память будет вытекать.Вы сами ответственны за очистку ip такого рода памяти.

По этой причине обычно считается плохой практикой хранить необработанные указатели в контейнерах STL.

Если вам действительно нужно использовать набор STL св нем есть необработанные строки C, это нормально, но имейте в виду, что вам придется восстанавливать память самостоятельно.Вам также нужно будет предоставить пользовательский компаратор для набора, чтобы сохраненные строки сравнивались по значению, а не по указателю (порядок по умолчанию в 'char *' просто сравнивает указатели, а не строки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...