Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C++] Dubbio su memoria dinamica

    Oggi mentre studiavo mi è venuto un dubbio sulle liste e sui puntatori.
    Ho una struttura T del tipo:
    codice:
    struct T{
            int *a;
            int b;      
    };
    poi inizializzo una lista di T, inserisco un nuovo elemento ed infine elimino gli elementi della lista:
    codice:
    list<T> lista;
    T new_elem = {new int, 2};
    lista.push_back(new_elem);
    lista.clear();
    Adesso che la lista è vuota il puntatore "int* a" che avevo inizializzato con "T new_elem = {new int, 2};" esiste ancora oppure è stato eliminato quando ho pulito la lista?
    Mi è sorto questo dubbio perché non vorrei avere memory leaks. In pratica io non ho mai richiamato delete ed è per questo che non so como dovrei comportarmi in questi casi.

  2. #2
    il problema non e' il puntatore a ma la memoria da esso puntata.

    Quando spingi new_elem dentro la lista, new_elem viene mossa.
    Quando chiami clear() la struct viene distrutta ma la memoria che hai allocato tu con new int no,
    a meno che tu non definisca un distruttore per T che chiama delete sul puntatore a.

    In quest'ultimo caso pero' c'e' il problema che, in un contesto di riuso del codice, il cliente
    della tua struttura potrebbe chiamare a sua volta delete sul puntatore a, dato che
    la memoria viene allocata all'esterno della struct.

    Ti consiglio di cercare "RAII" su google per una panoramica generale di questo tipo di problemi.







  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Puoi usare uno Smart pointer per rendere automatico il rilascio della memoria.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    ok, grazie ho capito tutto. Comunque Mr.Bloom mi sono spiegato male, intendevo la memoria puntata dal puntatore allocata con new int .

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 © 2024 vBulletin Solutions, Inc. All rights reserved.