У меня есть следующий класс
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));
strlen(argv[i]) + 1
. - person Marius Bancila   schedule 09.05.2011