Oppure

Loading
16/05/12 7:50
lorenzo
Compilatore: VC2010
S.O: Windows 7 32Bit/Windows XP 32Bit

In un programma che ho scritto all'allocazione di circa 1GB di ram la new ritorna un'eccezione di Bad_alloc.

Allora ho provato un codice di test per escludere errore di overflow o di corruzione dello heap. Il codice di test è il seguente:

	int *l;

	try
	{

	      while(true)
	     {
		l = new int[5000];
	     }

	}
	catch(std::exception &ex)
	{
		printf("%s\n", ex.what());
		getch();
	}


Non appena arrivo ad allocare 1 GB mi lancia la stessa eccezione di bad alloc. Ci sono parametri da VS che devo modificare? Oppure qualcosa nel registro di sistema?

PS: ovviamente ho più di 1GB di ram....3 per la precisione e al momento del crash ce ne sono liberi più di 2.
Ultima modifica effettuata da lorenzo 16/05/12 7:51
aaa
16/05/12 9:46
Potrebbe essere un problema di frammentazione della memoria.

Prova con l'allocazione di 10 char
16/05/12 10:04
lorenzo
Allora, allocando un char[10] alla volta effettivamente mi supera il GB(oltre 2GB infatti).

Però la cosa si complica. Nel mio programma non posso decidere quanto allocare, ho alcune strutture e devo utilizzarle così. Infatti il problema si verifica quando alloco(per l'ennesima volta) una struttura di 8Byte.

Come posso risolvere?
Ultima modifica effettuata da lorenzo 16/05/12 10:06
aaa
16/05/12 11:06
Dovresti allocare un a grossa porzione di memoria (come heap privato) e gestire al suo interno le allocazioni (può essere un'idea da provare ...)
16/05/12 12:04
lorenzo
Il programma è un database realtime. Non posso preallocare una memoria senza che siano stati inseriti dei record...non avrebbe senso.
Al momento dell'inserimento, devo allocare la struttura ma non prima.

Inoltre non ho capito la storia dello heap privato...cosa intendi dire?
Ultima modifica effettuata da lorenzo 16/05/12 12:06
aaa
16/05/12 12:32
Forse non mi sono spiegato ...

Crea un heap privato con la API

HeapCreate
msdn.microsoft.com/en-us/library/windows/desktop/…(v=vs.85).aspx

utilizzando una grande dimensione di memoria riservata al tuo processo

Poi allochi dal tuo heap privato con la

HeapAlloc
msdn.microsoft.com/en-us/library/windows/desktop/…(v=vs.85).aspx
16/05/12 12:51
anthony015
se invece utilizzassi una lista andrebbe bene o non sarebbe abbastanza veloce?
aaa
16/05/12 13:21
lorenzo
in che senso?
aaa