Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802

    Differenze tra forme di gestione puntatori

    Ciao Alka,
    apro un nuovo post per chiederti un'altra conferma sempre relativa a sti maledetti puntatori e allocazioni di memoria partendo da quello che mi hai detto nelle richieste precedenti.
    Se il mio codice contiene GetMem come in questo caso:

    //Alloco memoria per contenere il valore di ritorno della funzione da passare al software
    GetMem(Result,Length(ResponseBox)+1);
    //Copio il valore di ritorno nella variabile che la funzione ritorna
    Result := StrPCopy(Result, ResponseBox);

    Devo deallocare manualmente la memoria con FreeMem poichè l'allocazione è stata fatta anch'essa manualmente. E fino a qui ci siamo.
    Ma se io dovessi usare la forma:

    Result := @ResponseBox[1];
    oppure
    Result := PChar(ResponseBox);

    Non sono obbligato a gestire la deallocazione perchè ci pensa già delphi, in fin dei conti non alloco manualmente memoria ma lascio il compito a delphi. E' corretto quello che dico?

    Grazie
    www.beppegrillo.it
    Il blog di Beppe!!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Re: Differenze tra forme di gestione puntatori

    Originariamente inviato da colde
    Ma se io dovessi usare la forma:

    codice:
    Result := @ResponseBox[1];
    oppure
    Result := PChar(ResponseBox);
    Non sono obbligato a gestire la deallocazione perchè ci pensa già delphi, in fin dei conti non alloco manualmente memoria ma lascio il compito a delphi. E' corretto quello che dico?
    Sì, è corretto, ma il valore attribuito a Result è inutile se deve essere restituito, in quanto fa riferimento ad un'area di memoria che Delphi dealloca automaticamente non appena la stringa, che è la risorsa gestita in automatico, non viene più utilizzata.

    In sostanza, restituisci il puntatore ad un'area di memoria che è allocata per una variabile di tipo string e che viene distrutta quando la variabile string stessa non viene più utilizzata; ti rimane quindi in mano un puntatore ad un'area di memoria che non è più disponibile in un determinato lasso di tempo.

    E' proprio per questo motivo che occorre restituire il puntatore ad un buffer allocato "a mano" in cui, all'occorrenza, si copiano i caratteri di una stringa: essendo gestito autonomamente, Delphi non interviene in alcun modo sulla memoria in quanto è stata richiesta (e va deallocata) dallo sviluppatore. E' chiaro che lo sviluppatore deve poi farlo.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802
    Però ora come ora se uso quella forma dinamica, da software riesco a leggere i dati passati in quel modo dalla DLL senza alcun problema. Intendi dirmi che se creo il software con VB o altro diverso da delphi rischio di perdere i dati non appena la funzione della DLL termina? Il fatto è che se uso l'allocazione manuale mi da una marea di problemi, ne risolvo uno e ne esce un'altro e sinceramente non ne capisco il motivo, tipo che mi si blocca la funzione a metà, riceve X dati e poi si blocca tutto senza errori o messaggi (solo da debug vedo process inaccessible). Alla prima richiesta dati funziona che è un gioiello dopodichè inizia a collassare. Quindi se l'allocazione dinamica può funzionare anche con altri linguaggi manterrei questa finchè non riesco a capire sto stramaledetto problema che mi fa diventare pazzo (se solo non ci fossero caratteri null all'interno della stringa forse riuscirei anche a risolvere la cosa, ma purtroppo non è così). Che dici, è un rischio? In fondo dalla seriale mi arrivano una serie di stringhe e il massimo che posso fare come elaborazione ulteriore è inserirle in un DB o un file di testo.
    www.beppegrillo.it
    Il blog di Beppe!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.