Использование постоянного символьного указателя в контейнере std::set: потребление памяти

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

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

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

2 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам