Visualizzazione dei risultati da 1 a 4 su 4

Hybrid View

  1. #1
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Per il primo post.
    No, delete serve per cancellare singoli puntatori allocati con new mentre delete[] si usa per deallocare puntatori allocati con new[]
    Es.
    codice:
       int* alfa = new int; // alloco un singolo elemento con new
       delete alfa; // cancello l'elemento con delete
    
       int* beta = new int[16]; // alloco un array con new[]
       delete[] beta; // cancello l'array con delete[]
    Fare una semplice delete su qualcosa allocato con new[] ha comportamento indefinito.
    Non centrano nulla le matrici.

    Per il secondo post.
    Funziona benissimo...
    ...finché inserisci un elemento. Se provi a inserirne più di uno, prima o poi avrai un crash.
    int vettore; è UN int e basta, NON è un array di int. Usarlo come hai fatto nel primo esempio è un grave errore.

    Puoi allocare dove e quando ti pare, non ci sono limitazioni (memoria d sistema a parte), ma se vuoi che il secondo esempio funzioni devi passare il puntatore al puntatore in modo da poter modificare ciò che è all'esterno.
    (Come avviene con le liste.)
    codice:
    void LeggiArray(int** vettore ,int r){
        cout<<"Quanti elementi si vuole inserire nel vettore?\n";
        cin>>r;
        (*vettore)=new int[r];
        for(int i=0;i<r;i++){
        cout<<"inserire l'elemento in posizione "<<i<<endl;
        cin>>*((*vettore)+i);
        }
    }
    void StampaArray(int* vettore,int r){
            for(int i=0;i<r;i++)
                cout<<*(vettore+i)<<endl;
    }
    
    int main(int argc, char** argv) {
        int *vettore,r;
        LeggiArray(&vettore,r);
        StampaArray(vettore,r);
        delete[] vettore; // non dimenticare questa.
        return 0;
    }
    Se ti sembra strano, rifletti sul fatto che se scrivi:
    codice:
    int alfa = 10;
    int* beta = &alfa;
    *beta = 20;
    e ti ritrovi con alfa che vale 20, allo stesso modo se scrivi;
    codice:
    int* alfa = nullptr;
    int** beta = &alfa;
    (*beta) = new int(30); // Attenzione! Non [30]. Con (30) do direttamente il valore al singolo elemento.
    in *alfa ti ritrovi 30. Il motivo è che (*beta) è proprio alfa.
    Ultima modifica di shodan; 25-01-2016 a 00:06
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2015
    Messaggi
    32
    Quote Originariamente inviata da shodan Visualizza il messaggio
    Per il primo post.
    No, delete serve per cancellare singoli puntatori allocati con new mentre delete[] si usa per deallocare puntatori allocati con new[]
    Es.
    codice:
       int* alfa = new int; // alloco un singolo elemento con new
       delete alfa; // cancello l'elemento con delete
    
       int* beta = new int[16]; // alloco un array con new[]
       delete[] beta; // cancello l'array con delete[]
    Fare una semplice delete su qualcosa allocato con new[] ha comportamento indefinito.
    Non centrano nulla le matrici.

    Per il secondo post.

    ...finché inserisci un elemento. Se provi a inserirne più di uno, prima o poi avrai un crash.
    int vettore; è UN int e basta, NON è un array di int. Usarlo come hai fatto nel primo esempio è un grave errore.

    Puoi allocare dove e quando ti pare, non ci sono limitazioni (memoria d sistema a parte), ma se vuoi che il secondo esempio funzioni devi passare il puntatore al puntatore in modo da poter modificare ciò che è all'esterno.
    (Come avviene con le liste.)
    codice:
    void LeggiArray(int** vettore ,int r){
        cout<<"Quanti elementi si vuole inserire nel vettore?\n";
        cin>>r;
        (*vettore)=new int[r];
        for(int i=0;i<r;i++){
        cout<<"inserire l'elemento in posizione "<<i<<endl;
        cin>>*((*vettore)+i);
        }
    }
    void StampaArray(int* vettore,int r){
            for(int i=0;i<r;i++)
                cout<<*(vettore+i)<<endl;
    }
    
    int main(int argc, char** argv) {
        int *vettore,r;
        LeggiArray(&vettore,r);
        StampaArray(vettore,r);
        delete[] vettore; // non dimenticare questa.
        return 0;
    }
    Se ti sembra strano, rifletti sul fatto che se scrivi:
    codice:
    int alfa = 10;
    int* beta = &alfa;
    *beta = 20;
    e ti ritrovi con alfa che vale 20, allo stesso modo se scrivi;
    codice:
    int* alfa = nullptr;
    int** beta = &alfa;
    (*beta) = new int(30); // Attenzione! Non [30]. Con (30) do direttamente il valore al singolo elemento.
    in *alfa ti ritrovi 30. Il motivo è che (*beta) è proprio alfa.
    Perfetto, grazie mille. Tutto chiaro, alla prossima

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.