Повреждение кучи при освобождении памяти - PullRequest
5 голосов
/ 09 мая 2011

У меня есть класс следующим образом

 struct CliHandler {
     CliHandler(int argc, char** argv);
     ~CliHandler();

     int doWork();

     int argc_; 
     char** argv_;  
     private:
     CliHandler(const CliHandler&){}
     CliHandler& operator=(const CliHandler&){} 
 };

// Конструктор

 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]);
     } }

// Деструктор

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

Во время отладки я получаю ошибку«Обнаружено повреждение кучи. CRT обнаружил, что приложение записало в память после завершения буфера кучи.» Идентификатор моего вопроса «Где именно я делаю ошибку? Как мне ее исправить».Я использую visual stdio 2008.

Редактировать: я сделал что-то подобное, чтобы добавить 1

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

Что ужасно, поскольку увеличивает указатель argv [i] на единицу.Мой сотрудник указал на эту тонкую проблему.Это должно быть

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

Ответы [ 4 ]

8 голосов
/ 09 мая 2011

Измените код на:

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

Это потому, что ваш StrCpy, вероятно, перегружает вашу память.Вы также должны учитывать завершающий нуль-байт, при условии, что ваш StrCpy работает как стандартный strcpy (что необходимо для того, чтобы быть полезным, лучше просто использовать стандартный strcpy (), если у вас нет веских причин для этого).

sizeof (char) по определению 1, так что его тоже можно опустить.

1 голос
/ 09 мая 2011

Пожалуйста, используйте strdup () - он выделяет нужный объем памяти и копирует символы для вас.

1 голос
/ 09 мая 2011

Вам нужно выделить на один символ больше, чем strlen C-строки, если вы хотите скопировать ее. Это связано с тем, что strlen не считает нулевой символ завершения.

0 голосов
/ 09 мая 2011

Если StrCpy похож на strcpy, он запишет на один байт больше, чем возвращает strlen (), чтобы завершить строку нулем.

...