Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Bad_Alloc Windows
Forum - C/C++ - Bad_Alloc Windows

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 9:50
Mercoledì, 16/05/2012
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:

Codice sorgente - presumibilmente C/C++

  1. int *l;
  2.  
  3.         try
  4.         {
  5.  
  6.               while(true)
  7.              {
  8.                 l = new int[5000];
  9.              }
  10.  
  11.         }
  12.         catch(std::exception &ex)
  13.         {
  14.                 printf("%s\n", ex.what());
  15.                 getch();
  16.         }



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 il 16/05/2012 alle 9:51


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:46
Mercoledì, 16/05/2012
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 ...
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 12:04
Mercoledì, 16/05/2012
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 il 16/05/2012 alle 12:06


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:06
Mercoledì, 16/05/2012
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 ...
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 14:04
Mercoledì, 16/05/2012
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 il 16/05/2012 alle 14:06


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:32
Mercoledì, 16/05/2012
Forse non mi sono spiegato ...

Crea un heap privato con la API

HeapCreate
http://msdn.microsoft.com/en-us/library/windows/desktop/aa ...

utilizzando una grande dimensione di memoria riservata al tuo processo

Poi allochi dal tuo heap privato con la

HeapAlloc
http://msdn.microsoft.com/en-us/library/windows/desktop/aa ...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
anthony015 (Member)
Pro


Messaggi: 116
Iscritto: 20/05/2011

Segnala al moderatore
Postato alle 14:51
Mercoledì, 16/05/2012
se invece utilizzassi una lista andrebbe bene o non sarebbe abbastanza veloce?

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 15:21
Mercoledì, 16/05/2012
in che senso?


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
PM Quote
Avatar
anthony015 (Member)
Pro


Messaggi: 116
Iscritto: 20/05/2011

Segnala al moderatore
Postato alle 0:01
Giovedì, 17/05/2012
anziché allocare 5000 blocchi contigui ne allocassi 5000 sparsi accedendovi in maniera sequenziale

http://it.wikipedia.org/wiki/Lista_(informatica)

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo