На работе убил полдня на возню со странным багом. Есть двухсвязный список, организуется указателями first, last и у каждого элемента prev и next. Объекты в своих "конструкторах" сами себя в этот список добавляют, а в "деструкторах" из списка самоудаляются. Таким образом есть инвариант:в списке нет "трупов"(то есть объектов у которых был вызыван "деструктор"). Теперь начинается самое интересное. Во время работы программы в списке иногда всё-таки обнаруживается "труп". Код достаточно тривиальный. Методом пристального вглядывания перепроверил его сто раз, ошибки не нашёл.

Стал думать на нарушение потокобезопасности. Перепроверил, не нарушается.

Так пока и не разгадал.

Программировал бы на Сях подумал бы на порчу памяти, но я на C# в микрософтовском дотнете, вроде не должно. Хотя, конечно, полностью исключать глюк дотнетного рантайма всё же нельзя.