2011-09-28 1 views
1

Considérons le code suivant, compilé avec g++ problem.cpp -o problem:un problème désallocation de mémoire pour std non-créé dynamiquement :: vecteurs de stockage de données normale (non alloués dynamiquement)

#include <vector> 

using namespace std; 

int main() 
{ 
    while(1){} 
    return 0; 
} 

Lorsque ce code est exécuté, la commande top signale que ~ 80 Ko de mémoire est en cours consommé.

Ne manquez ce code:

#include <vector> 

using namespace std; 

int main() 
{ 
    vector<int> testVec; 
    for(int i = 0;i<100000000;i++)testVec.push_back(i); 
    while(1){} 
    return 0; 
} 

Comme prévu, haut rapport que près de ~ 300 Mo de mémoire est consommée.

Maintenant, enfin, considérer ce code:

#include <vector> 

using namespace std; 

int main() 
{ 
    vector<int> testVec; 
    for(int i = 0;i<100000000;i++)testVec.push_back(i); 
    testVec.clear(); 
    vector<int>().swap(testVec); 
    while(1){} 
    return 0; 
} 

maintenant top rapports que ~ 4196K est consommé - pourquoi pas seulement ~ 80K est que dans le premier exemple (!)? Comment puis-je enfin libérer ce dernier morceau de mémoire qui est vraisemblablement consommé par le vecteur? J'ai lu que, en plus de .clear(), le «tour de swap» est destiné à libérer tout mais apparemment il ne fonctionne pas comme je m'y attendais. Qu'est-ce que je rate?

+0

Les vecteurs allouent dynamiquement leurs données. Comment pourraient-ils pas? –

+0

... dans l'implémentation sous-jacente. Je vois maintenant que peut-être mon énoncé de problème est en effet naïf, mais encore l'esprit boggle .. –

+0

Par la nature même de la question, vous parlez des détails les plus bas niveau de la mise en œuvre sous-jacente. Comment pouvez-vous simultanément prétendre les abstraire? –

Répondre

3

Vous devriez probablement l'ignorer. L'astuce swap libère la mémoire du vecteur, mais cela ne signifie pas que l'allocateur (ou même l'implémentation malloc ou équivalente en dessous) restituera la mémoire au système. C'est-à-dire que le vecteur n'est probablement pas celui qui retient la mémoire.

+0

+1: Correct. Le PO essaye de formuler des prédictions sur le comportement de l'utilisation de la mémoire de son processus, sans aucun axiome pour faire quoi que ce soit d'autre qu'une comparaison de code relativement arbitraire et naïf à un programme vide. –

+0

Hmmm ... il semble juste bizarre que ce genre de chose puisse arriver. Je veux dire, la mémoire est utilisée à cause de l'allocation et ensuite je tente de la désallouer de la seule façon possible (?). Donc je suppose que ma question devient maintenant: comment peut-on s'assurer que l'allocateur rendra la mémoire au système? (Ai-je même le contrôle sur cela? –

+0

@Ben: Non. C'est quelque chose dont vous ne devriez pas vous inquiéter ni vous soucier. –

0

D'après ce que je sais, il y a deux façons de désaffecter la mémoire sur ce cas:

  1. Mettre le code qui utilise vecteur dans le support (simple et efficace)

    { 
        // .......... 
    } 
    
  2. commun pointeur, mais assurez-vous qu'il n'existe qu'un seul pointeur partagé. Vous pouvez appeler "reset" afin de libérer de la mémoire.

    shared_ptr<vector<int> > testVec(new vector<int>); 
    
+0

-1: Désolé, mais vous avez complètement manqué le point, et ces approches sont (plus ou moins) fonctionnellement équivalentes au programme OP. En attendant, pourquoi utiliseriez-vous jamais 'shared_ptr' si vous demandez que vous ne le partagiez pas? –

+0

Oic. Merci pour les commentaires. – dip

-1

Ne pensez-vous pas sur l'utilisation std :: deque à la place? Il a une politique d'allocation de mémoire différente et il a la possibilité de diminuer la mémoire allouée. Bien sûr, vous obtiendrez des performances médiocres en utilisant de grands ensembles de données.

+0

Salut Yuri, oui j'ai considéré une deque mais comme je ne m'intéresse qu'à ajouter des items à la fin du tableau et comme je ne fais jamais d'insertions d'effacement d'éléments internes, ce n'est pas vraiment nécessaire. En outre, le problème signalé par David R. ci-dessus persiste en ce que le processus d'allocation/désallocation de mémoire est partiellement affecté par sa mise en œuvre dépendant du système d'exploitation. –

+0

-1: Manque le point de la même manière que la réponse de dip. –

Questions connexes