Usare correttamente free()

di il
12 risposte

Usare correttamente free()

Ciao a tutti vorrei imparare ad usare correttamente l'istruzione free() per liberare la memoria occupata da un vettore riempito di oggetti struct mi spiego:

for (unsigned int i=0; i < prioSubChann.size(); i++)
{
struct alloc_map_element* temp=(struct alloc_map_element*)malloc(sizeof(alloc_map_element));
		temp->subchannelID=prioSubChann[i].subChannel;
		temp->priority = prioSubChann[i].priority;
		temp->enb=prioSubChann[i].usr_enb;
		temp->allocated = prioSubChann[i].allocated;
		temp->CQI=prioSubChann[i].cqich;
		temp->user=(Mac48Address)prioSubChann[i].ueAddr;
		prop_alloc_map.push_back(temp);
}
in pratica con il codice precedente riempio il vettore di oggetti alloc_map_element allocati con la malloc

vector <alloc_map_element*> prop_alloc_map;

ora ad un certo punto vorrei cancellare tutti questi oggetti alloc_map_element come dovrei fare?
grazie mille

12 Risposte

  • Re: Usare correttamente free()

    E' sconsigliato mixare C e C++. io userei un
    vector<std::shared_ptr<alloc_map_element>> il cui pensa da solo a liberare la memoria che si deve allocare con new o con std::make_shared
  • Re: Usare correttamente free()

    Perdona la mia ignoranza skynet ...
    ma non ho capito come devo fare o come usare questi shared pointer che mi dici tu....mi potresti fare un esempio per cortesia...
  • Re: Usare correttamente free()

    #include <iostream>
    #include <memory>
    #include <vector>
    
    struct alloc_map_element
    {
    
    };
    
    
    int main()
    {
    	std::vector<std::shared_ptr<alloc_map_element>> vettore;
    
    	for(int i = 0; i < 10; i++)
    	{
    		auto elem = std::make_shared<alloc_map_element>();
    		vettore.push_back(elem);
    	}
    
    	return 0;
    }
    Non c'è bisogno di eliminare gli oggetti in quanto il puntatore smart (shared_ptr) ci pensa da solo quando il reference count scende a zero.
  • Re: Usare correttamente free()

    skynet ha scritto:


    #include <iostream>
    #include <memory>
    #include <vector>
    
    struct alloc_map_element
    {
    
    };
    
    
    int main()
    {
    	std::vector<std::shared_ptr<alloc_map_element>> vettore;
    
    	for(int i = 0; i < 10; i++)
    	{
    		auto elem = std::make_shared<alloc_map_element>();
    		vettore.push_back(elem);
    	}
    
    	return 0;
    }
    Non c'è bisogno di eliminare gli oggetti in quanto il puntatore smart (shared_ptr) ci pensa da solo quando il reference count scende a zero.

    grazie del consiglio skynet, ma purtroppo non riesco a trovare lo shared_ptr .ho fatto l'inclusione di memory e
    using namespace std;
    ma quando dichiaro il mio vettore..mi segna tutto il rosso...
    sarà anche che sto usando un simulatore di rete NS3 forse vecchio e non è presente questa tipo di puntatore

    vector<shared_ptr<alloc_map_element>> vett;

    consigli ?
    grazie in anticipo
  • Re: Usare correttamente free()

    Compilatore?
    http://en.cppreference.com/w/cpp/memory/shared_pt
    (since C++11)
  • Re: Usare correttamente free()

    Io uso il gcc 3.4 su ubuntu...
  • Re: Usare correttamente free()

    Considerando che la release attuale di g++ si sta avvicinando alla 4.8, la tua versione risale al permiano. Dovresti aggiornare il compilatore (a meno che tu non abbia l'obbligo di usare la 3.4)
  • Re: Usare correttamente free()

    Non so se posso aggiornarlo....
  • Re: Usare correttamente free()

    Qualcuno mi potrebbe suggerire come aggiornare il compilatore alla versione 4.7...
    uso ubuntu 10.10
  • Re: Usare correttamente free()

    http://www.chimerarevo.com/ubuntu-come-installare-gcc-4-7/

    il testo non lo specifica ma può essere necessario cambiare uno o due symlink per far puntare g++ alla nuova versione.
  • Re: Usare correttamente free()

    Ragazzi questo metodo non funziona xke io sto lavorando su ubuntu 10.10 mentre la guida è per il 12
  • Re: Usare correttamente free()

    http://dev.modmancer.com/index.php/2012/01/20/gcc-4-7-0-on-ubuntu-10-10/

    prova a vedere se questo funziona, altrimenti puoi ripiegare sulla versione 4.1

    http://ubuntuguide.net/how-to-install-and-setup-gcc-4-1g4-1-in-ubuntu-10-0410-10
    che dovrebbe comprendere gli shared_ptr.

    Se ancora non riesci ad aggiornare, riprendiamo dal problema iniziale.
Devi accedere o registrarti per scrivere nel forum
12 risposte