Mehrere, aber keine, die das Verhalten erklären, das ich übrigens mit Visual C++ 2012 nicht reproduzieren kann.
Dein Code erkennt nicht, ob die Datei überhaupt geöffnet werden konnte.
Eof eignet sich nicht als Schleifenbedingung, weil es erst dann true liefert, wenn schon ein Lesevorgang fehlgeschlagen ist. Wenn du eine Leseschleife brauchst, nimm die Leseoperation selbst als Schleifenbedingung.
Benutz kein new[] für den Puffer, sondern std::vector.
Aber überhaupt ist die ganze Vorgehensweise ziemlich C-artig, wenn ich so sagen darf.
Wenn du ohnehin die ganze Datei einlesen willst, brauchst du keine Schleife:
std::wifstream wif(filename);
wif.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t>));
std::vector<wchar_t> v;
std::copy(std::istream_iterator<wchar_t, wchar_t>(wif), std::istream_iterator<wchar_t, wchar_t>(), back_inserter(v));
// oder wenn du es als string brauchst:
std::wstring s(v.begin(), v.end());
[/code]