+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 5 su 5

Utilizzo di new

  1. #1
    Push 0 non  in linea Scolaretto
    Ciao, sto seguendo un tutorial per impare ad ottene informazioni del Portable Executable di un file, l'esempio che sto seguendo scritto in C
    FileSize = GetFileSize(hFile, NULL);
    
    BaseAddress = (BYTE *) malloc(FileSize);
    
    dove FileSize dichiarato come DWORD, io visto che sto programmando in C++ volevo utilizzare new al posto di malloc
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    
    BYTE *BaseAddress = NULL;
    try 
    {
      BaseAddress = new BYTE ((BYTE)dwFileSize);
    } 
    catch (bad_alloc xa) 
    {
      exit(EXIT_FAILURE);
    }
    
    Il programma viene compilato corretamente, ma il valore di BaseAddress ottenuto con new differente da quello ottenuto con new, immagino che il problema sia nella conversione dei dati da DWORD a BYTE, ma non ne sono sicuro qualche suggerimento?

  2. #2
    Non e' detto che i valori dei puntatori siano uguali, ma il fatto e' che dovresti scrivere

    BaseAddress = new BYTE[dwFileSize];
    Ultima modifica di AntonioG; 29-11-2008 15:28 
    ℹ️ Leggi di pi su AntonioG ...

  3. #3
    L'avatar di bottomap
    bottomap non  in linea Amanuense
    Ciao,

    Quello che ottieni dalla new e dalla malloc un puntatore... pi che normale che tu ottenga valori diversi, in genere (se il programma non passa attraverso la cache - esiste qualcosa anche per gli eseguibili - e/o se c' pi di un thread che alloca memoria) non detto che tu ottenga lo stesso valore nemmeno in due esecuzioni differenti dello stesso programma.
    La memoria viene allocata dallo heap del processo ed assegnata... ovviamente il sistema operativo che alla richiesta di nuova memoria (new o malloc) si occupa di fornirtela, cercando nel pool il primo indirizzo disponibile e tornando un puntatore.

    Detto questo l'utilizzo che fai della new sbagliato... con la sintassi che hai espresso ottieni di creare un puntatore ad un BYTE, che contiene il valore, troncato nel range 0..255, di dwFileSize.
    Per allocare dwFileSize bytes (un array) la sintassi corretta :
    BaseAddress = new BYTE[dwFileSize]; //Nota che non c' alcun bisogno del cast
    
    Il try/catch non necessario (a meno che tu non voglia specificatamente una gestione fine delle eccezioni nel tuo programma)... basta che controlli BaseAddress... come con la malloc, il fallimento di una new lo imposta a NULL.

    Edit: Ooops... crosposting col buon Antonio

    Ciaociao
    ℹ️ Leggi di pi su bottomap ...

  4. #4
    Push 0 non  in linea Scolaretto
    Grazie funziona, non c'ero prorpio arrivato.

  5. #5
    Quote Originariamente inviato da Push 0 Visualizza il messaggio
    Grazie funziona, non c'ero prorpio arrivato.
    Scusa ma non e' questione di "arrivarci" (non sono cose che si immaginano) ...

    Bisogna studiare la corretta sintassi in un libro di C++, nei primi capitoli ...
    ℹ️ Leggi di pi su AntonioG ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Utilizzo Dll
    Da Marlboro nel forum Microsoft Word
    Risposte: 2
    Ultimo Post: 11-03-2011, 21:43
  2. Risposte: 2
    Ultimo Post: 01-12-2010, 10:38
  3. utilizzo IIF
    Da help48 nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 24-03-2008, 15:17
  4. [VB6] DLL Utilizzo
    Da UbySoft71 nel forum Visual Basic 6
    Risposte: 4
    Ultimo Post: 19-06-2007, 18:52
  5. Utilizzo di un ocx
    Da Steax nel forum Visual Basic 6
    Risposte: 5
    Ultimo Post: 21-03-2005, 17:53