nemyax
У нас кастомные аллокаторы с сентинелями.
Кажется, в CRT дебажный аллокатор тоже умеет проверять на предмет порчи, но я им не пользовался.
Проверь все массивы, нет ли выхода за границу.
Если порча у класс-мембера, проверь, нет ли перезаписи за пределы другого класс-мембера.
Попробуй комментировать memcpy и смотреть, пропадает ли баг.
Цитата:
nemyax писал: причём это число воспроизводимое
Ну это вообще самый идеальный и лёгкий для дебага вариант.
XaeroX писал:
Проверь все массивы, нет ли выхода за границу.
Попроверяю ещё, конечно. Но кабут всё укладывается в выделенные размеры на куче. А если выясняется, что размер данных малый, то и вовсе обхожусь массивом на стеке без кучы.
Цитата:
XaeroX писал:
У нас кастомные аллокаторы с сентинелями.
Не на асме же вы их пишете. Небось оборачиваете стандартные средства под конкретную задачу.
Насколько вообще надёжно перетирать структы, хранящие указатели?
nemyax писал: Когда у вас, опытные товарищи, начинается чертовщина с порчей памяти, где кроме аллокации-высвобождения вы ищете её причины?
Странная постановка вопроса. Ни аллокация ни высвобождение память не портят. Очевидно она портится во время использования. А высвобождение просто фиксирует этот факт. Ну это как ключи потерять где угодно, а искать возле фонаря, потому что там светлее.
Добавлено 21-08-2019 в 21:58:
Поглядел код. Если уж сохранять что-то с указателями, то логично кусок памяти выделять так чтобы в него попала структура + то что мы хотели сохранить. И тада уже можно с этим иметь дело. И не использовать явные указатели, а что-то типа (struct + 1). Ну это так, к слову.
Тут помойму проблема в самой задумке. Это вообще не будет нормально работать.
Систему - ничего. Ты сам там что-то херишь, но скорее всего просто не понимаешь этого. Это самый частый сценарий. Ты думаешь что всё в порядке, а сам что-то портишь. Я за все годы программирования один единственный раз столкнулся, когда мне система в штаны насрала - тот известный случай, когда в libc и msvcrt разная реализация atof. А всё остальное - это уже сам себе.
Дядя Миша писал:
Ты сам там что-то херишь, но скорее всего просто не понимаешь этого. Это самый частый сценарий.
Вот и я о чём. Система ведь единожды выделив память сама собой не переместит её содержимое. По крайней мере мы на это рассчитываем, когда пользуемся языком без сборщика мусора. Она даже течку допустит, но занятое место не тронет. Ну по идее.
Во-во, я ж и говорю что ты не о том думаешь. У тебя там что-то с указателями, скорее всего. Память-то на старом месте, а вот на что указатели указывают, это другое дело.
То, что я где-то написал фигню, не означает, что общая задумка работать не будет в принципе.
Меня плющит, что коллапс созревает постепенно к четвёртому-пятому анду-реду и только при использовании компилятора микрософта.