J'ai défini la classe MyString et maintenant je souhaite implémenter l'opération d'ajout. C'est horrible pour les fuites de mémoire, alors j'ai pris soin de libérer les pointeurs dynamiquement alloués du destructeur.Appliquer l'opérateur redéfinissant les classes avec des pointeurs d'allocation dynamique
#include <iostream>
class MyString {
private:
int _size;
char* _str;
public:
MyString() {
_size = 0;
_str = nullptr;
}
MyString(int size, char* str) {
_size = size;
_str = new char[size + 1];
strcpy(_str, str);
}
~MyString() {
delete[] _str;
}
void print() {
std::cout << _str << std::endl;
}
friend MyString operator+(const MyString& lhs, const MyString& rhs);
};
MyString operator+(const MyString& lhs, const MyString& rhs) {
char* temp = new char[lhs._size + rhs._size + 1];
strcpy(temp, lhs._str);
strcat(temp, rhs._str);
MyString ret(lhs._size + rhs._size, temp);
delete[] temp;
return ret;
}
int main() {
MyString first(5, "first");
MyString second(6, "second");
MyString add = first + second;
first.print();
second.print();
add.print();
}
Cependant, si je compile le code et l'exécuter, l'est bien imprimé first.print()
et second.print()
, mais le add.print()
affichera la valeur des déchets, et les accidents (Debug Assertion Failed!).
Sortie:
first
second
硼硼硼硼硼硼硼硼?흚 (and creashes :(..)
Si j'annoter et lance le destructor, il imprime bien, mais une fuite de mémoire se produit. Pourquoi cela arrive-t-il? J'ai regardé plusieurs exemples de substitution d'opérateur, mais je n'ai pas trouvé un exemple de cette allocation dynamique de pointeurs.
Toute suggestion sera grandement appréciée!
Vous devriez probablement en savoir plus sur [les règles de trois, cinq et zéro] (http://en.cppreference.com/w/cpp/language/rule_of_three). La mise en œuvre de la règle des trois devrait suffire à résoudre votre problème. –
Merci! Ajoutant le constructeur de copie par défaut, cela fonctionne bien comme des charmes. – youngminz