![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Fanat |
![]()
Сообщение
#1
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Список содержит указатели на элементы.
Необходимо удалить i-ый элемент списка, при этом удалить и сам элемент. Я делаю так
it += Index;
delete *it;
m_List.erase(it);
Всё работает если Index = 0, или если нет строки delete *it. А если удалить элемент с индексом больше 0 (меньше размера списка), то при следующем проходе по списку вылетает ошибка по доступу к памяти...как правильно сделать?.. |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Если список - это std::list, то достаточно одного erase(it)... delete здесь ни при чем совершенно.
|
Fanat |
![]()
Сообщение
#3
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
|
Michael_Rybak |
![]()
Сообщение
#4
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Цитата Если список - это std::list, то достаточно одного erase(it)... delete здесь ни при чем совершенно. volvo, там не объекты, а указатели, Fanat хочет и объект удалить, и указатель на него. Fanat, попробуй заменить it += index циклом. т.е. пробегай по списку вручную до нужного элемента. Сообщение отредактировано: Michael_Rybak - 23.01.2008 13:52 |
Fanat |
![]()
Сообщение
#5
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Fanat, попробуй заменить it += index циклом. т.е. пробегай по списку вручную до нужного элемента. Так на самом деле работает...но был перегружен оператор + таким же самым образом... Тут... Ну и пишу я соответственно не += ,а в нужном месте (it + Index). |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Fanat, это твой тип, или что-то готовое (я про то, на что указывает указатель)?
|
Fanat |
![]()
Сообщение
#7
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
|
Michael_Rybak |
![]()
Сообщение
#8
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Цитата Так на самом деле работает...но был перегружен оператор + таким же самым образом... Тогда тести для index = 1, сравнивай с перегрузкой и без (одновременно), смотри адреса и выясняй, где расхождение. |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата Мой тип. Можно посмотреть, как заполняется список? |
Fanat |
![]()
Сообщение
#10
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Можно посмотреть, как заполняется список?
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);
}
Вот так он заполняется...этого хватит или ещё чтото выложить?..хотя я уже решил везде заменить перегруженную операцию на пробег по итератору в цикле, так то она работает(далко только перегрузку конечно...=()...так что можно не искать ошибку... |
volvo |
![]()
Сообщение
#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 |
![]()
Сообщение
#12
|
![]() Fanat ![]() ![]() ![]() Группа: Пользователи Сообщений: 261 Пол: Мужской Реальное имя: Сергей Репутация: ![]() ![]() ![]() |
Ну, за исключением некоторых мелочей... У себя прогнал...В общем мелочью оказалась следующее: Я писал
delete *(it + aIndex);
m_List.erase(it + aIndex);
А ты
delete *(it = (it + aIndex));
m_List.erase(it);
Вот в твоём варианте всё работает хорошо...а в моём даже до ликов не доходит... ошибка вылетает... |
![]() ![]() |
![]() |
Текстовая версия | 8.08.2025 8:12 |