Во-первых, НЕ НАДО НИКОГДА использовать в программе на C++ malloc/free потому, что не надо этого делать никогда.
Во-вторых, что именно не нравится компилятору? Какое сообщение выдается и на какую программную строку? Как определен соответствующий тип? Напишите, вероятнее всего, это прояснит дело.
В третьих, существует большая разница между new и new[]. Объекты, созданные оператором new, в большинстве реализаций можно более или менее безболезненно удалить с помощью free, но вот то, что создано new[], удалять по free нельзя ни в коем случае!!! В общем, строжайшим образом проверьте соответствие аллокаторов-деаллокаторов, используемых при создании и удалении объектов: malloc-free, new-delete, new[]-delete[]. Но такие ошибки обычно проявляются не при компиляции, а при запуске в виде SIGSEGV или же жестоких глюков.
Опять же, в деструкторе чего вы пишете free(a)? Если a - это class vector {int N; complex *x; } - тогда вообще смертельно, т.к. освобождать надо зааллоцированный в конструкторе x, а vector сам освободится, раз уж его деструктор вызвался. Такой деструктор приведет к попытке двойного освобождения памяти вашего класса из двух элементов и к утечке памяти из-под complex, т.к. ее в этом случае не освободит никто. IMHO, должно быть написано:
vector::vector (int NumberOfElements)
{
N = NumberOfElements;
x = new complex[N];
}
vector::~vector()
{
delete[] x;
}
У Вас не так?