Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с указателями и выделение памяти 
V
    Опции темы
fish9370
Дата 21.4.2007, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Код

void dyList::DeleteSubstance(Element *pThis)
{
    if(pThis->szItem)
    {
        delete pThis->szItem;
        pThis->szItem=NULL;
    }
}


у кого какие соображения, как может получиться, что строка "delete pThis->szItem;" может ссылаться на чужую область памяти? это при том, что указатель pThis не был взят с потолка и имеет верные значения..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 21.4.2007, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Предположение:
1. Неправильно инициируется szItem
2. Адрес не того объекта передается.
PM MAIL ICQ   Вверх
fish9370
Дата 21.4.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



создание и инициализация производится вот так:

Код

nPos=nSPos=0;
while((nPos=FindNext("\r\n\r",szRecvBuff,nPos))>=0)      //put find word here
{
    pThis=EventChain.New();
    pThis->szItem=new char[nPos-nSPos];
    strCopy(szRecvBuff,pThis->szItem,nSPos,nPos);
    nSPos=nPos;
}


таким образом создается цепочка элементов, каждый из которых указывает на строку..
давльше после обработке, каждого из них, первый элемент удаляется..

это выглядит вот так:

Код

EventChain.Del(EventChain.First());


метод удаления выглядит так:

Код

Element* dyList::Del(Element *pElmnt)      //debuged [15.04.07]
{
    if(!pElmnt) return NULL;

    Element *pThis=pElmnt;
    if(pElmnt->pNext)
        pElmnt->pNext->pPrev=pElmnt->pPrev;
    if(pElmnt->pPrev)
        pElmnt->pPrev->pNext=pElmnt->pNext;
    if(pElmnt->pNext)                      //false, if pElmnt==pLast
        pElmnt=pFirst=pElmnt->pNext;
    else if(pElmnt->pPrev)
            pElmnt=pLast=pElmnt->pPrev;
         else pElmnt=pFirst=pLast=NULL;    //it was the Last Element
    DeleteSubstance(pThis);
    delete pThis;
    pThis=NULL;
    nCount--;
    return pElmnt;
//return next element address or previous, if it was last or NULL, if it was the Last
}


программа сыпется на том месте, где я указал в первом посте.. сыпится не сразу, далеко не на первой итерации, но что обидно - стабильно..
все осложняется , тем что я уже этот код запихнул в поток.. до этого, при трассеровке такого не наблюдалось..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
dizzy1984
Дата 21.4.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: нет
Всего: 25



Возможно дело в том, что память выделенная с помощью
Код

new []

должна удаляться с помощью
Код

delete []


попробуйте поменять
Код

 delete pThis->szItem;


на

Код
 
delete [] pThis->szItem;



Это сообщение отредактировал(а) dizzy1984 - 21.4.2007, 15:34
PM MAIL   Вверх
fish9370
Дата 21.4.2007, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



2 Dizzi1984 ты не поверишь, незадолго до твоего сообщения, я точно так же подумал.. и поставил эти квадратные скобки, ровно в том месте, в котором ты предложил.. к несчастью, это не помогло.. может еще какие-то идеи?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 21.4.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Если под трассировкой все работало, то конечно врядли в этом дело, но я совершенно не понял вот этого участка:
Код

   if(pElmnt->pNext)                      //false, if pElmnt==pLast
        pElmnt=pFirst=pElmnt->pNext;
    else if(pElmnt->pPrev)
            pElmnt=pLast=pElmnt->pPrev;
         else pElmnt=pFirst=pLast=NULL;    //it was the Last Element

PM MAIL ICQ   Вверх
fish9370
Дата 21.4.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Anikmar я так был восхищен своим кодом и мания упрощать все и вся, привели меня к подобным ошибкам.. эту ошибку я исправил (на которую ты указал).. но ошибка, главная ошибка, все еще беспокоит меня.. но ты показал мне, что мой код все еще дыряв как операционнная система виндоуз (не в обиду Биллу сказанно).. и за это тебе спасибо..

сейчас еще раз тщательно пробегусь отладчиком.. если есть еще какие мысли, был бы рад услышать..

Это сообщение отредактировал(а) fish9370 - 21.4.2007, 20:02


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 21.4.2007, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



У меня возникло впечатление, что все дело в пограничных случаях удаления элемента из цепочки... Именно по этому ошибка проявляется не сразу, а по достижения некого критерия - список пуст или в нем осталось 1 или 2 элемента и т.п.

Вообще-то я пока не писал серьезные многопоточные вещи, а так пару раз баловался, но даже с небольшими экспериментами я препочитал писать все в Лог - ошибки ловятся на ура.
PM MAIL ICQ   Вверх
fish9370
Дата 22.4.2007, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



Цитата(Anikmar @ 21.4.2007,  20:36)
У меня возникло впечатление, что все дело в пограничных случаях удаления элемента из цепочки... Именно по этому ошибка проявляется не сразу, а по достижения некого критерия - список пуст или в нем осталось 1 или 2 элемента и т.п.

Вообще-то я пока не писал серьезные многопоточные вещи, а так пару раз баловался, но даже с небольшими экспериментами я препочитал писать все в Лог - ошибки ловятся на ура.

ты же понимаешь, что именно так я и делаю.. все без толку.. могу логи привести.. я уже думаю, что это связанно как-то с потоками.. он сбоит абсолютно хаотично.. завтра буду думать.. сегодня начал с другого конца, делал интерфейс.. к среде нужно прогу предоставить.. хотябы бета-версию..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 22.4.2007, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(fish9370 @  22.4.2007,  00:45 Найти цитируемый пост)
ты же понимаешь, что именно так я и делаю.. все без толку.. могу логи привести.. я уже думаю, что это связанно как-то с потоками.. он сбоит абсолютно хаотично.. завтра буду думать.. сегодня начал с другого конца, делал интерфейс.. к среде нужно прогу предоставить.. хотябы бета-версию.. 


Ну тогда если только что-то с синхронизацией. Когда функция удаления узла влетает на реентерабельность, а судя по коду она там не поддерживается... Больше ничего в голову не приходит.
PM MAIL ICQ   Вверх
fish9370
Дата 22.4.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



докопался наконец.. оказывается, я просто не расчитал размер буфера под строку.. выделял впритык.. накинул еще 10 байт появилась стабильность и счастье.. всем еще раз спасибо..

вот как надо было:
Код

nPos=nSPos=0;
while((nPos=FindNext("\r\n\r",szRecvBuff,nPos))>=0)      //put find word here
{
    pThis=EventChain.New();
    pThis->szItem=new char[nPos-nSPos+10];
    strCopy(szRecvBuff,pThis->szItem,nSPos,nPos);
    nSPos=nPos;
}



--------------------
undefined
PM MAIL WWW ICQ   Вверх
fish9370
Дата 22.4.2007, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 1
Всего: 1



спасибо..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.