• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

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

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Raschet5
  • Дата начала
Статус
Закрыто для дальнейших ответов.
R

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 потом выдаёт ошибку. Что это за строка и что делает не знаю. Может это что-то объясняет? Подскажите кто знает. А то программа работает себе и жрёт память немеренно. И после десятка двух нажатий на кнопочку нужно перезапускать программу.
 
E

European

Смотрю на адрес при трассировке new и сравниваю с тем что delete. Они те же.
Самый первый и самый важный совет: после удаления переменной присваивайте ей значение NULL, иначе вы ничего не найдете. EAccessViolation выдается из-за того, что вы обращаетесь к памяти, которую или еще не инициализировали или которую уже удалили.
 
R

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 ссылаются на один и тот же объект. Если будут ещё комментарии пишите пожалуйста. Я пока не нашёл ошибку в своей программе.
 
E

European

Если будут ещё комментарии пишите пожалуйста. Я пока не нашёл ошибку в своей программе.
Тут только вы сами себе поможете :( Ставьте брейкпоинты на выделение и удаление памяти и вперед :)
Да, и еще... Используйте теги кода, пожалуйста
 
R

Raschet5

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

Raschet5

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!