1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

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

Тема в разделе "С и С++", создана пользователем Raschet5, 9 ноя 2009.

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

    Raschet5 Гость

    Репутация:
    0
    На форме - кнопка, дерево 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

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

    Raschet5 Гость

    Репутация:
    0
    Это я сделал сразу.

    Код:
    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

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

    Raschet5 Гость

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

    Raschet5 Гость

    Репутация:
    0
    Я нашёл свою ошибку. Я забыл про то, что при операциях new - > delete, затем снова new нужно почистить от мусора полученную память. :blink: А я привык к автоматическому обнулению.
     
Загрузка...
Похожие Темы - Не могу понять
  1. factura
    Ответов:
    3
    Просмотров:
    1.506
  2. smthelse
    Ответов:
    3
    Просмотров:
    2.427
  3. SeverBap
    Ответов:
    11
    Просмотров:
    4.476
  4. PavelT100
    Ответов:
    1
    Просмотров:
    2.094
  5. Djon253
    Ответов:
    6
    Просмотров:
    138
Статус темы:
Закрыта.

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