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

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

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

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


person Wheatevo    schedule 19.02.2011    source источник
comment
Действительно забавно, что в настоящее время мы считаем 4M небольшим объемом памяти. Я помню дни, когда целая ОС умещалась в 8 КБ или меньше (а приложение — в несколько раз меньше).   -  person Martin York    schedule 20.02.2011


Ответы (2)


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

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

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

person templatetypedef    schedule 19.02.2011
comment
Если OP действительно означает строковые литералы, то очистка памяти не требуется. - person Oliver Charlesworth; 20.02.2011
comment
@ Оли Чарльзворт - Согласен, но, поскольку это не было упомянуто явно, я не собираюсь это предполагать. Но вы правы — если это просто строковые литералы, никакой очистки не требуется. - person templatetypedef; 20.02.2011

Словом, ничего особенного не произойдет.

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

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

person Oliver Charlesworth    schedule 19.02.2011
comment
Спасибо за быстрый ответ! :) У вас есть предложения по альтернативным решениям? Есть ли способ создать набор массивов символов? - person Wheatevo; 20.02.2011