Bonne façon de réaffecter les pointeurs en c++

EDIT: je sais que dans ce cas, si il s'agissait d'une classe réelle, je serais mieux de ne pas mettre la chaîne sur le tas. Cependant, c'est juste un exemple de code pour m'assurer de comprendre la théorie. Le code va être d'un rouge noir de l'arbre, avec tous les nœuds stockées sur le tas.

Je veux m'assurer d'avoir ces idées de base correcte avant de passer (je viens d'une Java/Python à l'arrière-plan). J'ai été chercher sur le net, mais n'ai pas trouvé de réponse concrète à cette question.

Lorsque vous réaffectez un pointeur vers un nouvel objet, vous devez appeler delete sur l'ancien objet en premier pour éviter une fuite de mémoire? Mon intuition me dit que oui, mais je veux une réponse concrète avant de passer.

Par exemple, disons que vous avez eu une classe qui stockée un pointeur vers une chaîne

class MyClass
{
private:
    std::string *str;

public:
MyClass (const std::string &_str)
{
    str=new std::string(_str);
}

void ChangeString(const std::string &_str)
{
    //I am wondering if this is correct?
    delete str;
    str = new std::string(_str)

    /*
     * or could you simply do it like:
     * str = _str;
     */ 
}
....

Dans le ChangeString méthode, qui serait correct?

Je pense que je suis accroché sur si vous n'avez pas utiliser le mot clé new pour la deuxième façon, il sera toujours compiler et exécuter comme prévu. Est-ce que cela écraser les données, que ce pointeur pointe vers? Ou faut-il faire autre chose?

Tout conseil serait grandement appricated 😀

  • Il est plus que probable que vous ne devriez pas être affecter une chaîne de caractères avec new en premier lieu. Avez-vous une raison particulière pour que?
  • Lire la modifier en haut de la page
  • Une plus de chose naturelle à faire ici, serait toujours: *str = _str; (pas besoin de jeter une chaîne et d'en créer un autre, si vous voulez juste pour affecter le contenu)
  • C'est à peu près ce que ma question sur les centres de. Si je l'ai fait de cette façon, je l'aurais je une fuite de mémoire? D'après les commentaires ci-dessous, il sonne comme je le ferais.
  • Si vous voulez ared-l'arbre noir, quel est le problème avec std::map?
  • le but entier de la rouge noir de l'arbre est juste pour me faire intruduced de la langue et de la syntaxe de/etc. Chaque fois que je apprendre une nouvelle langue, je commence par la construction d'un rouge noir de l'arbre afin de m'assurer de comprendre les principes de base (c'est à peu près mon "hello world")
  • Naturellement, vous n'obtiendrez pas une fuite de mémoire avec *str = _str; (parce que std::string lui-même n'a pas de fuite). Notez que c'est de travailler avec des objets existants, pas d'adresses. - @Neil: Tout programmeur C++ doit être capable de gérer la mémoire manuellement et la mise en œuvre d'un RAII classe avec builtin les constructions de langage, donc il n'y a rien de mal à faire ces choses comme un exercice.
  • Merci, c'est exactement ce que je cherchais (n'était pas sûr si elle l'emporterait sur l'objet le pointeur souligné, ou en créer un nouveau, quelque part, entraînant une fuite de mémoire). C'est maintenant à moi de comprendre que "*pObject = DifferentObject' faudra juste remplacer l'ancien objet pObject points et à ne pas entraîner une fuite de mémoire. Merci
  • Il n'est pas exact de dire que *pObject = DifferentObject écrasera l'ancien objet. Il demande de l'opérateur d'affectation de pObject qui sera probablement copier le ème de l'information à partir de DifferentObject. (Dans le cas de std::string, oui, pObject finira contenant les mêmes caractères que DifferentObject fait.)
  • Simplement être en mesure de pirater un ensemble rouge-noir l'arbre, qui compile et semble ne pas vraiment vous apprendre quelque chose d'utile sur le C++. En C++, satisfaisant le compilateur est le moindre de vos problèmes. L'écriture d'un rouge-noir arbre comme un exercice d'apprentissage est une bonne idée, mais pour réellement apprendre quelque chose, vous devrez vous assurez que c'est 1) corriger, et 2) raisonnablement idiomatiques C++. Le premier est difficile à vérifier sur votre propre, et la deuxième est impossible. Qu'allez-vous faire pour vous assurer que vous apprendre quelque chose de cet exercice?

InformationsquelleAutor vimalloc | 2010-04-16