Heap corruption tout en libérant de la mémoire

J’ai un cours comme suit

struct CliHandler { CliHandler(int argc, char** argv); ~CliHandler(); int doWork(); int argc_; char** argv_; private: CliHandler(const CliHandler&){} CliHandler& operator=(const CliHandler&){} }; 

//Constructeur

  CliHandler::CliHandler(int argc, char** argv) { //set command line parameters argc_ = argc; argv_ = (char**) malloc(argc_ * sizeof(char*)); for(int i=0; i<argc_; ++i) { std::cout<<sizeof(argv[i]); argv_[i] = (char*) malloc(strlen(argv[i]) * sizeof(char)); StrCpy(argv_[i], argv[i]); } } 

// destructeur

  CliHandler::~CliHandler() { for(int i=0; i<argc_; ++i) free(argv_[i]); free(argv_); } 

Pendant la procédure de débogage, une erreur «Une corruption de segment de mémoire a été détectée. CRT a détecté que l’application avait écrit en mémoire après la fin de la mémoire tampon de segment de mémoire. J’utilise Visual Stdio 2008.

Edit: j’ai fait quelque chose comme ça pour append 1

argv_ [i] = (char *) malloc (strlen (argv [i] + 1) * sizeof (char));

Ce qui est terrible, car il incrémente le pointeur argv [i] de un. Mon collègue a souligné cette question subtile. CA devrait etre

argv_ [i] = (char *) malloc ((strlen (argv [i]) + 1) * sizeof (char));

Changer le code en:

  argv_[i] = (char*) malloc(strlen(argv[i]) + 1) ; strcpy(argv_[i], argv[i]); 

C’est parce que votre StrCpy va probablement détruire votre mémoire. Vous devez également prendre en compte l’octet nul final, à condition que votre StrCpy fonctionne comme la strcpy standard (ce qui est nécessaire pour être utile, il est préférable d’utiliser la strcpy standard () à moins que vous n’ayez une bonne raison de ne pas le faire).

sizeof (char) est par définition 1, donc cela peut être omis aussi.

Si vous souhaitez le copier, vous devez affecter un caractère de plus que le strlen d’une chaîne de caractères. En effet, strlen ne compte pas le caractère nul de la terminaison.

Veuillez utiliser strdup () – il alloue la bonne quantité de mémoire et copie les caractères pour vous.

Si StrCpy ressemble à strcpy, il écrira un octet de plus que les retours de strlen (), pour mettre fin à zéro à la chaîne.