Я не могу точно сказать, почему это не работает, но проблема в вашем коде, а не в Visual Studio. По какой-то причине вы передаете недопустимый указатель на функцию. Это либо нулевой указатель, либо он указывает на какой-то адрес, к которому у вас нет прав на чтение.
Если вы разместите еще немного кода (откуда вызывается функция и как она называется?), Мы можем указать на точную проблему.
Причина, по которой он работал в GCC или VC6, заключается в том, что это неопределенное поведение. Стандарт C ++ не говорит, что «это должно работать» или «это должно вызвать сбой». Все может произойти, если вы пишете в память, к которой у вас нет доступа. И в зависимости от компилятора и системы, на которой вы запускаете приложение, адрес, к которому вы обращаетесь, будет различаться. По счастливой случайности вы попали по адресу, который вызвал нарушение прав доступа при компиляции с VC2008. Под GCC и VC6 вам не повезло, и вы получили код, который , казалось, работал , и просто написал на какой-то мусорный адрес.