La corruption de segment, tout en libérant de la mémoire

J'ai une classe 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_);  }

Alors que je debug, j'obtiens une erreur " corruption de Segment détecté. Le CRT a détecté que l'application a écrit à la mémoire après la fin de segment de mémoire tampon. "Ma question id "exactement Où suis-je fait une erreur ? Comment puis-je résoudre ce problème". Je suis à l'aide de visual stdio 2008.

Edit:j'ai fait quelque chose de ce genre pour ajouter 1

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

Qui est terrible, comme il incrémente le pointeur de la argv[i] par un. Mon collègue a souligné que la subtile question. Il devrait être

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

Une chose que je vois est que vous n'avez pas à allouer de l'espace pour les nuls-terminator. Devrait être strlen(argv[i]) + 1.
Pourquoi, si vous êtes à l'aide de C++, êtes-vous à l'aide de malloc? Et pourquoi n'êtes-vous pas en utilisant std:;vecteur et std::string?
Un autre problème que je vois est que vous ne suivez pas les Règle de Trois. Si la copie se passe, vous êtes en difficulté.
je suis l'intégration de certaines fonctions avec le code existant.
Et alors? Les choses que vous allouer pour le privé, donc ils ne peuvent pas être utilisés directement par l'héritage de code, de sorte que vous pouvez (et devez) mettre en œuvre à l'aide de vecteurs et de cordes. Sinon, vous êtes tout simplement écrire PLUS de code legacy.

OriginalL'auteur Eternal Learner | 2011-05-09