Другие обращались конкретно к тому, почему у вас утечка - удаление списка указателей не удаляет объекты, на которые указывают, и не должно быть простым указателем, который не указывает, была ли это единственная ссылка на этот объект), ноЕсть и другие способы, чем необходимость повторять список при удалении для удаления указателей.
Поскольку в приведенном здесь примере нет никакой причины вообще использовать указатели на что-либо, так как вы 'использовать их, когда они входят в область действия, и отбрасывать их, когда они выходят из области действия, - вместо этого просто создайте все в стеке, и компилятор должным образом утилизирует все при выходе из области действия.Например,
while (1==1) {
std::list<std::string> sl;
std::string s = std::string("XXXXXXXXXXXXXXXXXXXXXXX");
sl.push_back(s);
}
Если вам нужно поведение указателя (чтобы избежать дублирования объектов, с которыми связаны многие вещи и т. Д. И т. Д.), Вам следует взглянуть на умные указатели, так какони устранят многие подводные камни, поскольку они могут автоматически обрабатывать подсчет ссылок и семантику, которая вам требуется.(В частности, посмотрите на интеллектуальные указатели повышения )
Существует много типов интеллектуальных указателей, которые вы можете использовать в зависимости от конкретной потребности и семантики владения для представления.
Std :: auto_ptr имеет строгое владение - если указатель «скопирован», оригинал обнуляется и право собственности передается - всегда существует только один действительный auto_ptr для объекта.Указанный объект удаляется всякий раз, когда интеллектуальный указатель с владельцем выходит из области видимости.
Кроме того, улучшаются общие и слабые указатели, используя подсчет ссылок, чтобы узнать, когда следует освобождать объект, на который указывает указатель.При использовании общих указателей каждая копия указателя увеличивает количество ссылок, и объект, на который указывает указатель, удаляется всякий раз, когда все общие указатели выходят за пределы области видимости.Слабый указатель указывает на объект, управляемый общим указателем, но не увеличивает счетчик ссылок, если все родительские общие указатели будут удалены, при попытке разыменования слабый указатель сгенерирует легко отслеживаемое исключение.
Очевидно, существуетгораздо больше, чем умные указатели, но я настоятельно рекомендую взглянуть на них как на решение, помогающее управлять вашей памятью.