Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. 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
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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?

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