[C++ WinAPI] alokacja pamięci,pliki binarne

0

Problem sprowadza się do sprawdzenia czy moge wczytać plik binarny czy nie...
Jeżeli czytam plik prosty to :
1)scanuje nagłówek

	ScanHdr Hdr02;
			if (!ScanGetHeader(&Hdr02, str))
			{
					MessageBoxA(NULL, "Read bin file", "Ups...", MB_ICONSTOP);
			}
2//tworze uchwyt do pliku
				file01=CreateFile(strFiles,GENERIC_READ, FILE_SHARE_READ |   FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
//pobieram rozmiar				
DWORD dwSize = GetFileSize(file01, NULL);
				if(dwSize == 0xFFFFFFFF)
				{MessageBoxA(NULL, "Zły rozmiar pliku!", "Błąd", MB_ICONEXCLAMATION);}
				else
				{
					LPSTR Bufor;
					Bufor = (LPSTR)GlobalAlloc(GPTR, dwSize);
						if(Bufor == NULL)
						MessageBoxA(NULL, "Błąd alokacji", "Ups...", MB_ICONSTOP);
				}
// no i powyżej mam kontrole czy mam wystarczająco pamięci by wczytać plik..

No i teraz dla mojego przypdaku chciałbym również sprawdzić czy mam wystarczająco pamięci, ale wczytuje dane w takiej postaci:


//Hdr02.PntCnt mam z wczytanego nagłówka	- znam liczbe elementó
//Hdr02.size                                                       - znam rozmiar pliku również z naglówka
				Pnt *Tbl=new Pnt[Hdr02.PntCnt];
				int *Sec=new int[Hdr02.PntCnt];
				Clr *Clr=new Clr[Hdr02.PntCnt];
				
		}

Dzięki za wskazówki...</cpp>

0

nie bardzo rozumiem, chcesz obsłużyć zwrócenie NULL dla GlobalAlloc???
jeżeli tak olej to, w praktyce takie rzeczy się nie zdarzają, windows dba o to żeby się nie zdarzały, a jeśli już się zdarzy, to raz na miliardy...

0

W skrócie..Mam wielkość pliku i ilość elementów...wykorzystuje NEW żeby zalokować pamięć...
chcialby jakiś komunitak np tak jak w przykladzie powyżej...Takie sprawdzenie czy da się do pamięci wczytać taki plik. jeśli tak no to działam: tworze 3 tablice i czytam z pliku, jeśli nie trudno...
bede wczytywał inaczej...

0

olej sprawdzanie tego, załóż że zawsze new zwróci ci dobrą ilość, nigdy sie nie się spotkałem, aby spowodował błąd, jak rezerwujesz coś przez new to możesz spokojnie zakładać że masz tle pamięci do dyspozycji ile zarezerwowałeś, nie musisz już nic sprawdzać...

W Windows raczej pamięć się nie skończy, nawet jeżeli zdarza się wyjątek, że plik stronicowania już jest pełny razem z pamięcią, winda niestety i tak jakoś sobie poradzi, czy stworzy nowy plik czy rozszerzy ten istniejący, niekończąca się ilość pamięci w windzie to świętość...

Poza jednym przypadkiem new zwróci błąd, sprawdzałem kiedyś ile można maksymalnie na raz zarezerwować przez new, otóż maksymalną wartością jest ilość fizycznej pamięci ram, po przekroczeniu tego już zwraca NULL, ale raczej tak dużych rzeczy nie będziesz tworzył :D

0
crayze napisał(a)

W Windows raczej pamięć się nie skończy, nawet jeżeli zdarza się wyjątek, że plik stronicowania już jest pełny razem z pamięcią, winda niestety i tak jakoś sobie poradzi, czy stworzy nowy plik czy rozszerzy ten istniejący, niekończąca się ilość pamięci w windzie to świętość...

Max 2GB per process.

0
0x666 napisał(a)
crayze napisał(a)

W Windows raczej pamięć się nie skończy, nawet jeżeli zdarza się wyjątek, że plik stronicowania już jest pełny razem z pamięcią, winda niestety i tak jakoś sobie poradzi, czy stworzy nowy plik czy rozszerzy ten istniejący, niekończąca się ilość pamięci w windzie to świętość...

Max 2GB per process.

Ale w 64bit też??

Oj takie wielkości to już wykraczają znacznie poza moje wymiary pamięci :D

No niech będzie każda normalna :> rezerwacja powinna zakończyć się powodzeniem, chyba, że jak wspomniał 0x666 rezerwujesz w programie tak duże ilości że dochodzi ci do 2GB wielkość programu, to wtedy można się troszczyć o poprawne rezerwacje...

Co do świętości rezerwacji, to nawet jak kiedyś zarezerwowałem new wielkość dostępnej mojej pamięci fizycznej(392 MB)(no trochę mniej niż z dokładnością co do bajta :D) to musiało popranie zadziałać, i kiedy odwołałem się do ostatniego elementu, praca dysku na 100% wydaje się że system stoi, ale po prostu wolno chodzi bo większa część systemu zapewne została przerzucona na dysk, aby zrobić mi miejsce wielkości pamięci fizycznej i co prawda program potem zamykał się 5min ale jak sie zamknął już było w miarę normalnie system znowu był normalnie w pamięci, i chociaż ledwo ciągnął żaden błąd się nie zrobił, wszystko pracowało jak w zegarku, stąd też mówię że winda dba o zarządzanie pamięcią, nawet gdy zarezerwujemy weilkość dostępenej pamięci ram, winda da nam taki obszar do dyspozycji i zwróci poprawny wskaźnik, bo to swiętość

0

Ale w 64bit też??

By default, 64-bit Microsoft Windows-based applications have a user-mode address space of 8 terabytes (7 terabytes on Itanium-based systems).

0

No, to w 64-bit też się skończy, 8 TB to naprawdę mało, więc warto sprawdzać poprawność alokacji. A na serio, poprawność alokacji lepiej sprawdzać zawsze, bo wtedy nawet ten 0,000001% wypadków jest obsłużony.

0
manfredek napisał(a)

No, to w 64-bit też się skończy, 8 TB to naprawdę mało, więc warto sprawdzać poprawność alokacji. A na serio, poprawność alokacji lepiej sprawdzać zawsze, bo wtedy nawet ten 0,000001% wypadków jest obsłużony.

jak kto woli, ja tam wolę nie marnować sprawdzania cyklów procka na if'a przy każdej alokacji skoro odsetek jest tak mały :>

//q: zejdz do żywych opodeow i zobacz, ze praktycznie nic nie zmarnujesz.. poza tym, lepiej 'marnowac' cykle procesora, czy cykle mózgu jak cos padnie?

0

sprawdzanie, czy new zwrócił NULL to stare ARMowe czasy. Obecnie w C++ new rzuca wyjątek bad_alloc, jak mu coś nie wyjdzie. Więc czy chcesz, czy nie - sprawdzanie jest wykonywane, a lejąc na nie, nie osiągniesz żadnej optymalizacj, a jedynie "uncaught exception".

I sprawdzasz nie if'ami, tylko dając try {...} catch{...}
jak ci się nie chce sprawdzać oddzielnie, to po prostu całą treść maina bierzesz w blok try i jedziesz.

0

crayze, jeszcze coś. Dla mnie sama możliwość wystąpienia błędu jest wystarczającym powodem żeby się przed tym błędem zabezpieczyć...

0

ciut zboczyliśmy z tematu, bo chłopak w tym topiku chce pomocy :>

a co do offtopu to każdy robi jak chce, mi sie nigdy nie zdarzyło aby "normalna" alokacja sie nie powiodła, więc nie będę brał takiej możliwości "w zwyczajnym programie" pod uwagę, gdy się kiedyś zdarzy coś takiego, zacznę :>

1 użytkowników online, w tym zalogowanych: 0, gości: 1