Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
Очистка памяти из-под контейнеров STL с динамическим выделением 16.10.09 10:03
Автор: Vedrus <Serokhvostov Anton> Статус: Member Отредактировано 16.10.09 10:14 Количество правок: 3
|
Есть вот такой код, который "мусорит" в памяти:
{
LPSTR lpsz;
vector<LPSTR> vText;
for (int i = 0; i < 10; i++)
{
lpsz = new char[20];
lstrcpy(lpsz, "Hello World!");
vText.push_back(lpsz);
}
}
---
Очистится ли здесь автоматически память при выходе из области видимости, в которой объявлен vText? Освободится ли память из-под "вручную" созданных строк?
Сейчас я в цикле прохожусь по всем его элементам и делаю явный delete для каждой строки. Можно ли без этого обойтись?:
{
while (vText.size() > 0)
{
delete m_vText.back();
m_vText.pop_back();
}
}
---
|
|
вектор удалится, строки нет 16.10.09 12:48
Автор: dl <Dmitry Leonov> Отредактировано 16.10.09 12:55 Количество правок: 1
|
> Сейчас я в цикле прохожусь по всем его элементам и делаю > явный delete для каждой строки. Можно ли > без этого обойтись?:
Нельзя, хотя делать на каждой итерации pop_back дороговато, достаточно после цикла дернуть clear.
Я для всех списков вообще обычно использую такую стандартную конструкцию (в VS 2008 SP1 можно заменить boost:: на std::tr1::, должно сработать):
template<class T> inline void DoDelete(const T& p)
{
delete p;
}
template <class List> void ClearList(List& lst)
{
for_each(lst.begin(), lst.end(), boost::bind(&::DoDelete<List::value_type>, _1));
lst.clear();
}
---
Вызывать просто как ClearList(vText).
и для мапов еще
template <class Map> void ClearMap(Map& map)
{
for_each(map.begin(), map.end(), boost::bind(&::DoDelete<Map::mapped_type>, boost::bind(&Map::value_type::second, _1)));
map.clear();
}
---
|
| |
жаль =( 16.10.09 14:55
Автор: Vedrus <Serokhvostov Anton> Статус: Member
|
|
|
|