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:
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 № 1Juste 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!