C++ pointeur non valide erreur
Je suis invalide point d'erreur dans le code ci-dessous je ne vois pas pourquoi. Tout ce que je suis en train de faire est de supprimer la gratuit de certaines chaînes sur le tas à partir d'un vecteur:
void func() {
vector<string>* vec = new vector<string>;
vec->push_back(*(new string("1")));
vec->push_back(*(new string("2")));
for(vector<string>::iterator itr = vec->begin(); itr != vec->end(); ++itr)
{
string* ptr = &(*itr);
delete(ptr);
}
}
MODIFIER: est-ce parce que push_back crée une copie de la chaîne?
vec->push_back(*(new string("1")));
= fuite de mémoireparce que
push_back()
crée une copie et les feuilles de la chaîne sur le tas de référence, correct?Si vraiment vous voulez allouer sur le tas, plus sûrs à utiliser les boost.org/doc/libs/1_35_0/libs/ptr_container/doc/...
correct
OriginalL'auteur user1861088 | 2013-02-22
Vous devez vous connecter pour publier un commentaire.
Votre erreur est parce que la élément n'est pas allouée dynamiquement; la vecteur est. Ce que vous essayez de faire:
Mais honnêtement, je vois peu de raisons pour ce faire. Comme écrit votre code, non seulement les tentatives pour supprimer de la mémoire il n'a jamais réellement allouée, il fuit ce qu'il attributions il ne faire.
Il sont raisons pour stocker des pointeurs vers des objets dans un vecteur de ce type (comme les objets étant en fait d'un autre conteneur de quelque chose et vous avez besoin d'une liste temporaire d'entre eux pour une mesure de l'opération de tri sans perturber le contenu d'origine), mais quelque chose me dit que vous êtes un des moyens de avoir un tel besoin.
Vous utiliser un vecteur de pointeurs. Mais vous avez probablement aucune raison de le faire.
Tout d'abord, concernant les pointeurs de la possession de ressources, voir cette simple doc qui le résume bien. Si vous devez utiliser des pointeurs, et ceux des pointeurs les ressources dont ils soulignent, de leur donner des cerveaux (faire des pointeurs intelligents). Sinon, la bande de roulement très, très attentivement. L'exemple de la raison pour laquelle je cite pour l'utilisation d'un vecteur de pointeurs nus est considérable parce que les pointeurs dans le vecteur ne serait pas propre aux ressources qu'ils pointent vers. Dur pour l'image, je sais, mais important.
ça c'est un autre problème que l'accès à un élément qui est stocké dans un conteneur. En général, vous avez vraiment besoin de comprendre C++ sémantique de propriété si vous êtes tout va utiliser des pointeurs. Si vous avez besoin de retourner un objet à partir d'une fonction, retour par valeur. C++11 a une sémantique de déplacement qui, généralement, s'assurer que l'objet est déplacé, plutôt que de les copier. Sinon, si vous n'êtes pas à l'aide de C++11, compte tenu de retourner un pointeur intelligent ou (moins de préférence) à l'aide d'une "sortie de la valeur de paramètre".
Absolument, il est. il est venu d'un long depuis le C++ w/STL il ya de nombreuses lunes. Le 1300+ pages du C++11 document de normes est en soi un témoignage de la façon dont beaucoup mieux qu'il est défini.
OriginalL'auteur WhozCraig
Tout d'abord, la ligne
est à l'origine d'une fuite de mémoire. La valeur renvoyée par
new string("1")
est un pointeur vers un nouvellement allouée objet de type string. Mais quand vous déréférencement et de l'insérer dans le vecteur, un copie de la allouées sur la pile d'objet est créé et inséré. Cependant, la chaîne réelle de l'objet d'origine que vous avez alloué sur le tas est une fuite.Essentiellement, votre vecteur est de stocker des objets string en valeur, pas des pointeurs vers des objets string. La copie de l'objet string qui est inséré dans le vecteur n'est PAS un segment de mémoire allouée objet (n'est pas un objet alloué avec
new
). Et bien sûr, vous ne pouvez pasdelete
quelque chose qui n'était pas attribué avecnew
. Ainsi, lorsque vous appelezdelete(ptr)
vous sont à l'origine de comportement indéfini.Ce que vous semblez vouloir ici est un:
vector<string*>* vec = new vector<string*>;
Cependant, en général, je ne vois pas de raison majeure pourquoi vous allouez de tout sur le tas. En C++, il est préférable d'utiliser l'allocation de pile et de conteneurs avec la valeur sémantique dans la mesure du possible, à moins d'avoir une raison pour laquelle vous avez besoin de tas de répartition (par exemple, un conteneur d'objets polymorphes, dans ce cas, vous devez utiliser des pointeurs intelligents de toute façon). En général, lorsque de nouveaux programmeurs C++ utilisation allouées sur la pile des objets et de la
new
mot-clé dans tous les sens, c'est un signe qu'ils sont mal transliterating un style de programmation importée à partir d'un langage managé comme le Java ou le C#.OriginalL'auteur Charles Salvia
Non, vous n'êtes pas votre vecteur magasins
string
des objets, pas des pointeurs versstring
objets. C'est pourquoi vous avez la*
dans votrepush_back
appelez - vous un déréférencement du pointeur retourné.Vous ajoutez un copie de la dynamique de la chaîne que vous créez avec
new
et que la dynamique de la chaîne est perdu, puisque vous ne jamais stocker le pointeur denew
retourne.OriginalL'auteur Nik Bougalis