У меня есть набор, который включает указатели на выделенную память, я использую метод clear для примера: setname.clear();
, и сам набор очищается и его указатели, но я все еще получаю утечки памяти, потому что по какой-то причине выделенная память остается нерасчищенной.Как освободить память из набора
0
A
ответ
6
std::setclear() метод удаляет элементы из набора. Однако в вашем случае набор содержит указатели, которые удаляются, но память, на которую они указывают, не освобождается. Вы должны сделать это вручную перед вызовом clear()
, например:
struct Deleter
{
template <typename T>
void operator() (T *ptr)
{
delete ptr;
}
};
for_each (myset.begin(), myset.end(), Deleter());
Существует библиотека в Boost называется Pointer Container, которая решает эту проблему.
4
Set only очищает то, что он сам выделяет. Если вы сами что-то выделяете, вам придется очистить его самостоятельно.
3
Clear()
удаляет указатели, а не объекты, на которые он указывает. Вам нужно либо выполнить итерацию по каждому объекту, прежде чем удалить его на delete
, либо использовать что-то вроде std::tr1::shared_ptr
(также в Boost).
Смежные вопросы
- 1. Освободить память
- 2. Как освободить память?
- 3. Как освободить виртуальную память?
- 4. Informix - как освободить память?
- 5. PtrToStringChars, как освободить память?
- 6. Как освободить память?
- 7. Как освободить память?
- 8. Как освободить/освободить память в игре android
- 9. Как освободить память при выходе из приложения?
- 10. Как освободить память, созданную из CFStringTokenizerCreate?
- 11. Как освободить память из списка классов
- 12. Как освободить память, используемую lxml.etree?
- 13. MIPS32 - освободить память
- 14. Как освободить память, выделенную gcnew?
- 15. Как освободить память после strsep()?
- 16. Освободить память для объекта
- 17. Как освободить память, заявленную V8?
- 18. Как освободить память сохраненного объекта
- 19. Как освободить память, созданную SKTexture
- 20. Как освободить память в Perl
- 21. попробуйте наконец, как освободить память
- 22. Как освободить память, добавленный AVAsset
- 23. Как освободить память в go?
- 24. C++ как освободить память * char?
- 25. Как освободить память, используемую MediaElement
- 26. Как освободить память в функции
- 27. Как освободить память в .NET?
- 28. Как освободить память на Java?
- 29. Как освободить память локального хранилища?
- 30. Как освободить память, выделенную dlopen()?
Или, если доступно Boost, попробуйте сделать его набором boost :: shared_ptr (from Boost.SmartPtr: http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/smart_ptr.htm). По-моему, у TR1 тоже есть smart_ptr. –
gregg
shared_ptr будет отличным накладным, если указатель на самом деле не разделен, а просто находится в наборе (во избежание копирования, например). Это было одной из причин создания ptr_container. – 2010-09-23 14:23:55
@ Vlad Lazarenko Что делать, если набор содержит int? – Pegah