Не могу понять где искать. Выдаётся ошибка ... Eaccessviolation ... Ac

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем Raschet5, 9 ноя 2009.

Статус темы:
Закрыта.
  1. Raschet5

    Raschet5 Гость

    На форме - кнопка, дерево TTreeView. По кнопке создаётся дерево элементов написанного мною класса. (Привязываю МОЁ дерево к TTreeView). Память выделяю new.
    Указатель на корень делаю в модуле формы. При нажатии на кнопку снова, память под старым деревом должна освобождаться. Но при delete указатель_на_экземпляр_класса выводится ошибка ...EAccessViolation... Причём не на первом элементе (из 14 на 3-м).
    Смотрю на адрес при трассировке new и сравниваю с тем что delete. Они те же. Пробовал делать массив указателей на все элементы дерева и потом через массив удалаять - результат тот же. Самое первое что сделал - рекурсивный деструктор. Но результат тот же.
    Я не пойму в чём дело. Где искать. Я очень сильно забыл язык и среду и пытаюсь вспомнить всё. Подскажите на что обратить внимание. Где искать. Я заблокировал удаление вследствие путаницы в переменных и модулях или действительно адреса не так присвоил? Или может ещё чего.
    Память выделяется нормально, как мне кажется. Я обращаюсь к экземпляру класса на котором идёт ошибка при удалении, но он выдаёт нормальные данные. Pointer->Summa, Pointer->ID всё показывает верно. При delete этого элемента трассировка уходит в Forms.hpp на строку
    /* TCustomForm.Destroy */ inline __fastcall virtual ~TForm(void) { }
    Отрабатывает на ней раз 30 потом выдаёт ошибку. Что это за строка и что делает не знаю. Может это что-то объясняет? Подскажите кто знает. А то программа работает себе и жрёт память немеренно. И после десятка двух нажатий на кнопочку нужно перезапускать программу.
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Самый первый и самый важный совет: после удаления переменной присваивайте ей значение NULL, иначе вы ничего не найдете. EAccessViolation выдается из-за того, что вы обращаетесь к памяти, которую или еще не инициализировали или которую уже удалили.
     
  3. Raschet5

    Raschet5 Гость

    Это я сделал сразу.

    Код (C++):
    void Reflection::Clear(Analiz* AF)
    {    
    if (AF)
    {
    for (int i = 0; i < AF->AmountMoves; i++)
    if (AF->Pointers[i]) Clear(AF->Pointers[i]);
    };
    delete AF;
    AF = NULL;
    }
    Но только здесь. Это единственное место где я делаю delete.
    За комментарии спасибо. Теперь хоть точнее понятно в чём проблема, после расшифровки ошибки. Поищу на предмет повторного удаления и "неверных" адресов в Pointers. Вдруг AmountMoves больше чем реальных new или Pointers ссылаются на один и тот же объект. Если будут ещё комментарии пишите пожалуйста. Я пока не нашёл ошибку в своей программе.
     
  4. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Тут только вы сами себе поможете :( Ставьте брейкпоинты на выделение и удаление памяти и вперед :)
    Да, и еще... Используйте теги кода, пожалуйста
     
  5. Raschet5

    Raschet5 Гость

    Насчёт тэгов кода, конечно. Я увидел как это делается, теперь буду так оформлять.
    Спасибо. Буду дальше разбираться. Если появятся более конкретные затыки, надеюсь на опытные комментарии! :)
     
  6. Raschet5

    Raschet5 Гость

    Я нашёл свою ошибку. Я забыл про то, что при операциях new - > delete, затем снова new нужно почистить от мусора полученную память. :blink: А я привык к автоматическому обнулению.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей