La corruption de segment détecté après le bloc normal
J'ai le code suivant et ne suis pas sûr pourquoi suis-je la corruption de segment détecté l'erreur quand il frappe le destructeur de Myclass. Je crois que je suis la désallocation de la mémoire correctement ??
#include <iostream>
#include <vector>
using namespace std;
class MyClass{
private:
char* mp_str;
public:
MyClass():mp_str(NULL){}
~MyClass(){
delete [] mp_str;
}
void setString(const char* str);
void printString();
};
int main(){
MyClass* a = new MyClass();
std::vector<MyClass> myVector;
myVector.push_back(*a);
a->setString("Hello World");
myVector[0].setString("Goodbye world");
a->printString();
myVector[0].printString();
return 1;
}
void MyClass::setString(const char* const str){
if(!str)
return;
size_t len = strlen(str);
if(!this->mp_str){
this->mp_str = new char[len];
memset(mp_str, 0, len+1);
}
strncpy(mp_str, str, len);
}
void MyClass::printString(){
if(this->mp_str)
cout << mp_str;
else
cout << "No string found";
}
MODIFIER: (code Fixe)
void MyClass::setString(const char* const str){
if(!str)
return;
size_t len = strlen(str);
if(!this->mp_str){
this->mp_str = new char[len+1];
memset(mp_str, 0, len+1);
}
strncpy(mp_str, str, len);
}
dans main(), j'ai également ajouté
delete a;
avant d'appeler return 1;
Besoin de la la Règle de Trois.
vous avez également la fuite de l'objet dans
d'accord. fixe.
Oui, je comprends qu'une copie de
Si j'étais certain que c'était la cause de la panne, je l'aurais posté une réponse. Comme un commentaire, il indique une suggestion que vous devez suivre (car il va entraîner les mêmes casse-tête plus tard si pas fixe). Ce qui concerne
vous avez également la fuite de l'objet dans
a
d'accord. fixe.
Oui, je comprends qu'une copie de
a
est poussé sur le vecteur et j'ai besoin d'une copie en profondeur ici. Je dois suivre la Règle de Trois. Toutefois, le code ne doit pas lancer de telles erreurs. Rafael réponse m'a aidé à me signaler l'erreur!Si j'étais certain que c'était la cause de la panne, je l'aurais posté une réponse. Comme un commentaire, il indique une suggestion que vous devez suivre (car il va entraîner les mêmes casse-tête plus tard si pas fixe). Ce qui concerne
OriginalL'auteur brainydexter | 2012-07-26
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'allouer de la longueur de la chaîne +1, pour tenir compte de la valeur null. Vous êtes memsetting droite.
Attention tout de même que ce n'est de loin pas la seule erreur. Voir les commentaires ci-dessus (qui devrait vraiment être des réponses)
D'accord.
OriginalL'auteur Rafael Baptista
(Posté après Rafael réponse était accepté, comme il se doit.)
La saturation de la mémoire tampon a été certainement la cause de cet incident particulier, mais l'accident aurait pu être évité par la simplification de la mise en œuvre, tout en les ajustant pour l'adhésion à l' La règle de Trois. À savoir, depuis que vous avez mis en place un destructeur (pour traiter
mp_str
), vous devriez également avoir mis en place un constructeur de copie et un opérateur d'affectation.Mais, une autre façon de respecter TRoT est pour éviter d'avoir à mettre en œuvre toutes ces choses à tous. Dans ce cas, à l'aide d'un
std::string
au lieu d'unchar *
aurait résolu à la fois de l'accident, et être TRoT conforme:Si parfois vous avez à écrire C brutes!
Un pointeur intelligent serait préférable brut des pointeurs, et toujours laisser le code de la Pourriture conforme.
OriginalL'auteur jxh