Что можно предпринять?
1.
отладчики умеют брякаццо на факт изменения значения по адресу.
вы знаете, какой объект у вас слетает.
значит можете поставить бряку на его изменение.
ну а дальше нужно пасти - кто меняет.
почему, и на каком основании.
то есть смотрим стек вызовов.
может быть кто-то из соседнего потока накосячил?
2.
техника отладки называется "хвостик".
смысл идеи в том, что бы выявить факт пробоя памяти.
для этого нужно подвинуть аварийный объект в сторонку:
int main()
{
std::string ololo;
}
int main()
{
int border1[255];
std::string ololo;
int border2[255];
}
если после этого баг c деструктором перестанет воспроизводится,
значит действительно пробой памяти.
то есть, кто-то где-то вылез за пределы допустимого диапазона и попал прямо по вашей строке.
после вставке бордера, адрес строки смещается,
и пробой идет по массиву.
строка выживает.
но скорее всего краш будет где-то дальше
(а может и не будет)
3.
дебажный велосипед.
в отдельном потоке состояние строки постоянно мониторится.
идет проверка: находится ли строка в консистентном состоянии,
или уже нет.
если уже в неконсистентном состоянии (содержит запрещенные символы, size слишком большой, etc),
то исполнение уходит на ветку кода, где стоит обычная бряка.
ну а дальше см пункт 1.
===========================================
вам в любом случае нужно зафиксировать факт изменения строки,
после которого она становится в неконсистентном состоянии.