Est-ce un C++ valide (par exemple, ne pas invoquer UB) et obtient-il ce que je veux sans fuites de mémoire? Valgrinds se plaint de la non-concordance free
et delete
mais dit "aucune fuite n'est possible" à la fin.new [n] et supprime chaque emplacement avec delete à la place du bloc entier avec delete []
int main() {
int* a = new int[5];
for(int i = 0; i < 5; ++i)
a[i] = i;
for(int i = 0; i < 5; ++i)
delete &a[i];
}
La raison pour laquelle je demande: J'ai une classe qui utilise boost::intrusive::list
et je new
chaque objet qui est ajouté à cette liste. Parfois, je sais combien d'objets je veux ajouter à la liste et je pensais à utiliser new[]
pour allouer un morceau et être toujours capable de delete
chaque objet à part avec le style Disposer de boost::intrusive
.
Exactement. Et, quand vous allouer quelque chose avec new (ou new []), il stocke une notation dans une table quelque part que le bloc de mémoire particulier est alloué. Les appels delete (ou delete []) correspondants rechercheront cette notation. –
"Vous ne pouvez pas appeler delete sur ce qui n'a pas été alloué par new ou vous obtenez une corruption de tas." Vous obtenez un accident! –