J'ai étudié l'allocation dynamique et je suis tombé sur cette question sur StackOverflow :
Désallocation d'objets stockés dans un vecteur ?
L'une des réponses votées explique comment gérer manuellement la mémoire lors de l'utilisation de "Vecteurs de pointeurs vers des objets" : itérer à travers le vecteur en appelant delete.
Ma question porte sur la manière de supprimer des éléments particuliers d'un vecteur, et non le vecteur entier. Dans l'exemple de programme ci-dessous, j'ai un vecteur de pointeurs d'objets. Imaginez que la variable x de ces objets soit décrémentée au fil du temps... Lorsque la valeur x d'un objet atteint un certain nombre (disons 3), je souhaite supprimer l'objet ; CEPENDANT, j'aimerais que le vecteur puisse toujours être trié en fonction des valeurs x des objets.
Le problème est que lorsque j'appelle delete sur les objets dont les valeurs x atteignent 3, l'objet est supprimé mais il y a toujours un pointeur qui pointe vers des emplacements de mémoire aléatoires, et la taille du vecteur reste également la même.
Lorsque je boucle sur le vecteur en imprimant les valeurs x, les éléments sur lesquels j'ai appelé delete sont toujours là mais pointent vers des valeurs comme -53408995. Comment puis-je me débarrasser de l'élément pointeur du vecteur ainsi que de l'objet ?
Appeler erase n'est pas une option car dans mon programme réel (pas l'exemple minimal ci-dessous) le vecteur est continuellement TRIE par d'autres facteurs qui changent les équivalents des valeurs x. Je ne peux pas garder trace de leur index. Je voudrais supprimer à la fois l'objet et l'élément pointeur lorsque j'itère à travers le vecteur pour vérifier la valeur x.
Exemple :
#include <iostream>
#include <vector>
class A
{
public:
A(int i) { x = i; }
int x;
};
int main()
{
std::vector<A*> Vec;
Vec.push_back(new A{ 5 });
Vec.push_back(new A{ 4 });
Vec.push_back(new A{ 3 });
std::cout << "Size before = " << Vec.size() << std::endl; // 3
for (auto& a : Vec)
{
std::cout << a->x << std::endl;
if (a->x == 3) { delete a; }
}
std::cout << "Size after = " << Vec.size() << std::endl; // Still 3!
for (auto& a : Vec)
{
std::cout << a->x << std::endl; // Prints 5, 4 and a random memory location like -34528374
}
return 0;
}