ifstream file ("heightMap.raw", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
heightMap = new char [size];
uheightMap = new unsigned char [size];
file.seekg (0, ios::beg);
file.read (heightMap, size);
file.close();
uheightMap = reinterpret_cast<unsigned char*>(heightMap);
delete [] heightMap;
}
Nie! Nie możesz usunąć heightmapy w tym momencie, a jeśli to zrobisz to uheightmap jest w tym momencie również do wyrzucenia.
Nie mówiąc o tym że przy przypisaniu jednocześnie tracisz dostęp do poprzednio zaalokowanej pamięci w uheightmap.
Przypisanie wskaźnika nie ma nic wspólnego z kopiowaniem danych.
Rozwiązanie - najprościej usunąć new unsigned char[size]
, usunąć delete [] heightMap
;
ifstream file ("heightMap.raw", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
heightMap = new char [size];
file.seekg (0, ios::beg);
file.read (heightMap, size);
file.close();
uheightMap = (unsigned char*)(heightMap);
}
Tylko z tym jest pewien problem - nie możesz zwalniać pamięci z innego typu wskaźnika niż alokujesz. Proponuję:
ifstream file ("heightMap.raw", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
uheightMap = new unsigned char [size];
file.seekg (0, ios::beg);
file.read ((char*)uheightMap, size);
file.close();
}
A, i z tego co pamiętam, można jeszcze tak:
basic_ifstream<unsigned char> file ("heightMap.raw", ios::in|ios::binary|ios::ate); // basic_ifstream<unsigned char>
if (file.is_open())
{
size = file.tellg();
uheightMap = new unsigned char [size];
file.seekg (0, ios::beg);
file.read (uheightMap, size);
file.close();
}