Ktoś tu chyba nie ogarnia do końca wskaźników ;) Po co tam to new?
Zamiast pisać:
char* temp = new char[sizeof(BITMAPFILEHEADER)];
fileImage.read(temp, sizeof(BITMAPFILEHEADER));
BITMAPFILEHEADER* fileHeader = (BITMAPFILEHEADER*)(temp);
wystarczy:
BITMAPFILEHEADER fileHeader;
fileImage.read(reinterpret_cast<char*>(&fileHeader), sizeof(BITMAPFILEHEADER));
Nie ma new i nie ma wycieków pamięci. To samo robisz z resztą alokacji via new, bo są one kompletnie zbędne.
Co do czytania samej bitmapy, to robisz to źle - wiersze są wyrównane do 4 bajtów, czyli bitmapa RGB8 o szerokości 3 pikseli nie będzie miała wiersza o wielkości 9 bajtów, ale 12 (3 bajty wyrównania na końcu). Zresztą zakładasz też, że bitmapa zawsze jest 8-bitowa (ta z kolei posiada paletę, której nie czytasz).
std::vector <std::vector <uint8_t> > Pixels;
Lepiej użyj std::vector <RGBTRIPLE> do trzymania całej bitmapy.