IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Список. Удаление, Builder 6.0
Fanat
сообщение 23.01.2008 13:27
Сообщение #1


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Список содержит указатели на элементы.
Необходимо удалить i-ый элемент списка, при этом удалить и сам элемент.
Я делаю так

           it += Index;
           delete *it;
           m_List.erase(it);


Всё работает если Index = 0, или если нет строки delete *it.
А если удалить элемент с индексом больше 0 (меньше размера списка), то при следующем проходе по списку
вылетает ошибка по доступу к памяти...как правильно сделать?..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 11)
volvo
сообщение 23.01.2008 13:31
Сообщение #2


Гость






Если список - это std::list, то достаточно одного erase(it)... delete здесь ни при чем совершенно.
 К началу страницы 
+ Ответить 
Fanat
сообщение 23.01.2008 13:38
Сообщение #3


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Цитата(volvo @ 23.01.2008 13:31) *

Если список - это std::list, то достаточно одного erase(it)... delete здесь ни при чем совершенно.


Да это std::list, но вылетают потери памяти если удалять просто erase(it)...а если с delete *it то нет...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Michael_Rybak
сообщение 23.01.2008 13:52
Сообщение #4


Michael_Rybak
*****

Группа: Модераторы
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Цитата
Если список - это std::list, то достаточно одного erase(it)... delete здесь ни при чем совершенно.


volvo, там не объекты, а указатели, Fanat хочет и объект удалить, и указатель на него.

Fanat, попробуй заменить it += index циклом. т.е. пробегай по списку вручную до нужного элемента.

Сообщение отредактировано: Michael_Rybak - 23.01.2008 13:52
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Fanat
сообщение 23.01.2008 14:02
Сообщение #5


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Цитата(Michael_Rybak @ 23.01.2008 13:52) *

Fanat, попробуй заменить it += index циклом. т.е. пробегай по списку вручную до нужного элемента.


Так на самом деле работает...но был перегружен оператор + таким же самым образом...
Тут...
Ну и пишу я соответственно не += ,а в нужном месте (it + Index).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 23.01.2008 14:20
Сообщение #6


Гость






Fanat, это твой тип, или что-то готовое (я про то, на что указывает указатель)?
 К началу страницы 
+ Ответить 
Fanat
сообщение 23.01.2008 14:31
Сообщение #7


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Цитата(volvo @ 23.01.2008 14:20) *

Fanat, это твой тип, или что-то готовое (я про то, на что указывает указатель)?


Мой тип.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Michael_Rybak
сообщение 23.01.2008 14:59
Сообщение #8


Michael_Rybak
*****

Группа: Модераторы
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Цитата
Так на самом деле работает...но был перегружен оператор + таким же самым образом...

Тогда тести для index = 1, сравнивай с перегрузкой и без (одновременно), смотри адреса и выясняй, где расхождение.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 23.01.2008 16:24
Сообщение #9


Гость






Цитата
Мой тип.
Можно посмотреть, как заполняется список?
 К началу страницы 
+ Ответить 
Fanat
сообщение 23.01.2008 16:33
Сообщение #10


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Цитата(volvo @ 23.01.2008 16:24) *

Можно посмотреть, как заполняется список?



int __fastcall TTrfObjectList::add(ILXListItem* aItem)
{
  m_List.push_back(aItem);
  return m_List.size();
};




for(int i = 0; i < c_nNumberOfStartElems; i++)
     { 
      ILXListItem* pItem = new TTrfListItem(i*10*pow(-1,i));
      m_pList->add(pItem);
     }



Вот так он заполняется...этого хватит или ещё чтото выложить?..хотя я уже решил везде заменить перегруженную операцию на пробег по итератору в цикле, так то она работает(далко только перегрузку конечно...=()...так что можно не искать ошибку...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 23.01.2008 17:47
Сообщение #11


Гость






Fanat, я не совсем понимаю, откуда у тебя берутся leak-и... Вот смотри:

class TMyList: public list<int*>
{
	friend
	TMyList::iterator&
	operator + (TMyList::iterator &it, int index) {
		for(; index; --index) ++it;
		return it;
	}

public:
	void erase_element(int index) {
		TMyList::iterator it = begin();
		delete *(it = (it + index));
		erase(it);
	}

	~TMyList() {

		for(TMyList::iterator
			it = begin(); it != end(); delete *it++) {
		}
	}
};

void __fastcall TForm1::Button2Click(TObject *Sender)
{
	TMyList myList;

	for(int i = 0; i < 20; i++) {
		int *p = new int(i);
		myList.push_back(p);
	}

	myList.erase_element(5);

	for(TMyList::iterator it = myList.begin();
		it != myList.end(); it++)
	{
		Memo2->Lines->Add(IntToStr(*(*it)));
	}
}

Код аналогичен твоему, правда? Ну, за исключением некоторых мелочей... Только почему-то у меня CodeGuard молчит... Попробуй у себя прогнать это, будет ругаться?
 К началу страницы 
+ Ответить 
Fanat
сообщение 23.01.2008 18:33
Сообщение #12


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Цитата(volvo @ 23.01.2008 17:47) *

Ну, за исключением некоторых мелочей...


У себя прогнал...В общем мелочью оказалась следующее:
Я писал

    delete *(it + aIndex);
    m_List.erase(it + aIndex);



А ты

    delete *(it = (it + aIndex));
    m_List.erase(it);



Вот в твоём варианте всё работает хорошо...а в моём даже до ликов не доходит...
ошибка вылетает...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 8.08.2025 8:12
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"