Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Azzerare memoria

5 views
Skip to first unread message

Prgo

unread,
Jan 2, 2013, 2:03:10 PM1/2/13
to
Come si fa ad allocare 2gb e a riempirla di zeri?
Inoltre, si può invocae il "zero-page thread" per azzerare tutta la
memoria inutilizzata?

Vincenzo Ferraioli

unread,
Jan 3, 2013, 5:15:55 AM1/3/13
to
Cosa intendi con "Riempirla di zeri"?

in Win32 esiste una funzione che "azzera" gli array: ZeroMemory, non so se
fa al caso tuo


Kan

unread,
Jan 3, 2013, 8:42:10 AM1/3/13
to
Il 02/01/2013 20.03, Prgo ha scritto:
> Come si fa ad allocare 2gb e a riempirla di zeri?

const int size = 2000000000;
BYTE ar = new BYTE[size];
ZeroMemory(ar, size);
delete[] ar;

oppure:

std::vector<BYTE> v(size);

Sempre che il tuo processo riesca ad allocare tutta quella memoria...

Prgo

unread,
Jan 3, 2013, 11:16:35 AM1/3/13
to
Kan ha scritto quanto segue il 03/01/2013 14.42>
> const int size = 2000000000;
> BYTE ar = new BYTE[size];
.\Msg.cpp(485) : error C2440: 'initializing' : cannot convert from 'BYTE
*' to 'BYTE'

> ZeroMemory(ar, size);
.\Msg.cpp(486) : error C2664: 'memset' : cannot convert parameter 1 from
'BYTE' to 'void *'

> delete[] ar;
.\Msg.cpp(487) : error C2541: 'delete' : cannot delete objects that are
not pointers

se uso
BYTE* ar = new BYTE[size];
crasha

Prgo

unread,
Jan 3, 2013, 11:26:50 AM1/3/13
to
con
const int size = 1073741824;
crasha ancora
mentre con
const int size = 1073741824/2;
funziona
Penso che dipende dalla memoria disponibile in quel momento.
Ma comunque quando funziona tutta la ram č azzerata all'istante cosě
oppure chessň č solo allocata?

Prgo

unread,
Jan 3, 2013, 11:52:38 AM1/3/13
to
Prgo ha scritto quanto segue il 03/01/2013 17.26>
> con
MEMORYSTATUSEX statex.ullAvailPageFile-7600000
sembra funzionare meglio ma come posso trovare con precisione il valore
della memoria da passare in
BYTE* ar = new BYTE[size];
?

xnoise

unread,
Jan 3, 2013, 12:28:16 PM1/3/13
to
Il 03/01/2013 17:26, Prgo ha scritto:
> con
> const int size = 1073741824;
> crasha ancora
> mentre con
> const int size = 1073741824/2;
> funziona

Che vuol dire crasha, scusa.
Mi sembra di ricordare che il fallimento di new genera una eccezione
bad_alloc. Se ti ritorna questa eccezione ok potrebbe dipendere dalla
memoria che non riesce ad allocare ma se crasha in altro modo il
problema e' altrove.

Raffaele Rialdi [MVP]

unread,
Jan 3, 2013, 1:56:29 PM1/3/13
to
Se lo fai per motivi di sicurezza dovresti usare la funzione
SecureZeroMemory:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366877.aspx

Occhio che le funzioni ZeroMemory e la memset non garantiscono
l'azzeramento.

ZeroMemory è un alias di memset:
minwinbase.h
#define ZeroMemory RtlZeroMemory

winnt.h
#define RtlZeroMemory(Destination,Length)
memset((Destination),0,(Length))

La memset può essere eliminata dall'ottimizzatore:
http://www.viva64.com/en/d/0208/
Ed è infatti per questo motivo che esiste la SecureZeroMemory


Il risultato più disastroso si ha in TOR che purtroppo espone i suoi
utenti a disastrosi bug di sicurezza:
http://www.viva64.com/en/b/0178/

--
Raffaele Rialdi http://www.iamraf.net
Weblog: http://blogs.ugidotnet.org/raffaele
Microsoft MVP profile
https://mvp.support.microsoft.com/profile/raffaele
UGIdotNET - http://www.ugidotnet.org/


Kan

unread,
Jan 4, 2013, 7:04:48 AM1/4/13
to
Il 03/01/2013 17.26, Prgo ha scritto:
> con
> const int size = 1073741824;
> crasha ancora
> mentre con
> const int size = 1073741824/2;
> funziona
> Penso che dipende dalla memoria disponibile in quel momento.
> Ma comunque quando funziona tutta la ram è azzerata all'istante così
> oppure chessò è solo allocata?

l'istruzione new alloca solamente,
l'istruzione ZeroMemory (o meglio ancora SecureZeroMemory, come ha fatto
giustamente notare Rialdi) azzera la memoria.

0 new messages