информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
вектор удалится, строки нет 16.10.09 12:48  Число просмотров: 1517
Автор: 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();
}

---
<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
<"чистая" ссылка> <обсуждение закрыто>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach