/ / delete et gestion de la mémoire - c ++, mémoire, gestion de la mémoire

suppression et gestion de la mémoire - c ++, mémoire, gestion de la mémoire

J'ai trouvé des résultats inattendus sur la gestion de la mémoire avec le code (exemple) suivant:

#include <stdint.h>
#include <iostream>
#include <vector>

#define BIGNUM 100000000

// sample struct
struct Coordinate {
uint64_t x;
uint64_t y;
uint64_t z;
Coordinate() {
x = 1ULL;
y = 2ULL;
z = 3ULL;
}
};

int main() {
std::vector<Coordinate*>* coordinates = new std::vector<Coordinate*>();

for (int i = 0; i < BIGNUM; ++i)
coordinates->push_back(new Coordinate());

// block 1
for(std::vector<Coordinate*>::iterator it = coordinates->begin(); it != coordinates->end(); ++it)
delete(*it);

// block 2
delete(coordinates);

std::cout << "endn";
std::cin.get();

return 0;
}

Sur mon Ubuntu 14.04:

entrer la description de l'image ici

La commande ps aux --sort -rss a été effectuée sur std::cin.get(); 4 fois, avec de petites différences:

1) programme tel quel

2) avec le bloc 1 commenté (fondamentalement, pas de suppression sur chaque élément de vecteur)

3) avec le bloc 2 commenté (donc pas de suppression sur le vecteur)

4) les deux blocs 1 et 2 ont été commentés.

Avec mon (gros) test de surprise 1) et 2) ont presque le même RSS / VSZ résultats. En termes simples, il semble que delete(*it); ne fonctionne pas correctement (ne libère pas de mémoire). Même conclusion peut être atteint avec 3) et 4).

Sous Windows XP (fonctionnant dans VirtualBox), tout va bien et la mémoire est de 0 à 2 Mo pour l'exécution du programme tel quel.

Réponses:

3 pour la réponse № 1

Juste parce que delete libérer de la mémoire ne signifie pas que la mémoire est immédiatement restituée au système d’exploitation pour un usage général. La gestion de la mémoire sur les systèmes d’exploitation modernes est simplifiée. juste pas si simple.

Il n'y a rien de mal ici autre que vos hypothèses!