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
nessuno
Potrebbe essere un problema di frammentazione della memoria.

Prova con l'allocazione di 10 char
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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
nessuno
Dovresti allocare un a grossa porzione di memoria (come heap privato) e gestire al suo interno le allocazioni (può essere un'idea da provare ...)
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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
nessuno
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
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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