hoe om het geheugen van ongeordende_set te bevrijden?

Ik vraag me af hoe het geheugen te bevrijden std :: unordered_set nam?

Ik denk dat unordered_set :: clear() de set eenvoudigweg wist zonder het geheugen vrij te maken.

Ik moet de ongeordende_set-hold door de lokale functie bevrijden. Elke keer als ik de lokale functie opriep, verbruikt het geheugen, dus ik moet het vrijmaken aan het einde van de lokale functie.

Dank je

2
Is de ongeordende_set lokaal bij de functie? Als dat zo is, wordt het geheugen aan het einde van de functie correct vrijgegeven zonder dat u iets hoeft te doen.
toegevoegd de auteur Mankarse, de bron

3 antwoord

De gebruikelijke manier om het geheugen van een ongeordende_set te wissen is hetzelfde als voor elke standaardcontainer:

set = std::unordered_set()

Je kan ook gebruiken:

std::unordered_set().swap(set)

wat de gebruikelijke manier was om het geheugen vrij te geven uit containers in de dagen vóór r-waarde refs.

U moet T vervangen door het type objecten in de set.

2
toegevoegd
Sorry ... ik heb een deel van het voorbeeld weggelaten. U moet de sjabloonparameter opgeven voor de ongeordende_set (zie de bewerking).
toegevoegd de auteur Mankarse, de bron
Je moet surround de code gebruiken in backticks: `code`
toegevoegd de auteur Mankarse, de bron
U hoeft niet beide te doen std :: tr1 :: unordered_set > (). Swap (_closelist); en _closelist = std :: tr1 :: unordered_set > (); . Ofwel op zichzelf is prima. Maar je hebt gelijk. Het is niet gegarandeerd dat dit resulteert in een ongeordende_set die geen enkel geheugen bezit. Wat het zal doen, is het geheugenverbruik terugbrengen tot het kleine aanvankelijke geheugenverbruik van een standaard geconstrueerde ongeordende_set , die aanzienlijk minder moet zijn dan het geheugenverbruik van een ongeordende reeks bevat veel elementen.
toegevoegd de auteur Mankarse, de bron
wanneer ik dit doe: std :: tr1 :: unordered_set :: swap (_closelist); het toont 'fout:' template class std :: tr1 :: unordered_set 'used without template parameters' en when i do _closelist.swap (std :: tr1 :: unordered_set ()); het toont error: missing template arguments before '(' token
toegevoegd de auteur weeo, de bron
dus in wezen we de set toewijzen met een nieuw leeg type? Ik denk dat mijn geheugen niet is vrijgegeven ..... ik doe
 std :: tr1 :: unordered_set > (). Swap (_closelist) ; _closelist = std :: tr1 :: unordered_set > ();
toegevoegd de auteur weeo, de bron
Waarom kan ik de code zoals de jouwe niet typen ... = = ...
toegevoegd de auteur weeo, de bron
Ik test het met deze code, het gebruikt 2,7 GB geheugen, maar alleen gratis tot 2,5 GB code //test gratis set//std :: tr1 :: unordered_set > _closelist; voor (i = 0; i <30000000; i ++) {std :: tr1 :: array test = {9,8,3,7,2,1,6,10,5,13,0, 4,12,15,14, i}; _closelist.insert (test); } std :: tr1 :: unordered_set > (). swap (_closelist); printf ( "hahahahahahhahahaha \ n \ n \ n \ n \ n \ n"); Code
toegevoegd de auteur weeo, de bron
Ja ... het zal het geheugen zeker verminderen. Kent u een functie voor ongeordende_set zoals malloc en gratis die al het geheugen kan vrijmaken? Ik denk dat we malloc niet kunnen gebruiken voor ongeordende_set?
toegevoegd de auteur weeo, de bron

unordered_set automatically releases the memory it takes if its on the stack:

void some_function()
{
    unordered_set set;
   //use the set
}//set memory will be deallocated automatically here
1
toegevoegd

De set is een knooppunt-gebaseerde container, dus het geheugen voor de knooppunten is inderdaad goed vrijgegeven. Maar omdat de hash-tabel mogelijk tot veel verschillende buckets is gegroeid, kunt u rehash (1) proberen om deze weer kleiner te maken - maar dat is slechts een hint; de set is niet vereist om het aantal emmers te verminderen.

0
toegevoegd
Ik moet de ongeordende_set-hold door de lokale functie bevrijden. Elke keer als ik de lokale functie opriep, verbruikt het geheugen, dus ik moet het vrijmaken aan het einde van de lokale functie.
toegevoegd de auteur weeo, de bron