double *data=new double[n];
...
delete []data;
По иронии судьбы:
1. n не проверялась;
2. n оказалась равна нулю;
3. В некоторых местах было принудительное обращение к data[0].
Что тут удивительно, так это то, что выделение памяти проходило успешно, а вот при освобождении программа падала (Access Violation). С чем это было связано точно -- не выяснил. Предполагаю, что как раз с обращением к нулевому элементу, которое прокатывало, пока память не пытались освободить. Хотя тогда должно было бы быть сообщение о HEAP corruption, хммм.
Стал по всей программе проверять подобные случаи (а их там около десятка в разных местах).
Я: Так... я посмотрел буфера... простите, пожалуйста. Там всё в порядке.
Коллега: Какой ты некультурный!
Я: Я не понимаю, о чём ты.