У меня есть система плагинов в моем проекте (работает на Linux), и часть этого является то, что модули имеют метод «запустить», такие как:Отладка коррупции параметра в C++?
void run(int argc, char* argv[]);
Я звоню плагин и перейти к проверьте мой массив argv (после выполнения кучу других вещей) и массив поврежден. Я могу напечатать значения в верхней части функции, и они верны, но не позже в исполнении. Ясно, что что-то развращает кучу, но Я в недоумении, как я могу попытаться точно определить, что переписывает эту память. Valgrind не очень помог мне.
Пример кода по запросу:
Мой плагин выглядит так:
void test_fileio::run(int argc, char* argv[]) {
bool all_passed = true;
// Prints out correctly.
for (int ii=0; ii < argc; ii++) {
printf("Arg[%i]: %s\n", ii, argv[ii]);
}
<bunch of tests snipped for brevity>
// Prints out inccorrectly.
for (int ii=0; ii < argc; ii++) {
printf("Arg[%i]: %s\n", ii, argv[ii]);
}
}
Это связано в систему, которая выставляет его на питона, так что я могу назвать эти плагины как функции питона. Итак, я беру параметр строки в моей функции питона и разорвать, что из таким образом:
char** translate_arguments(string args, int& argc) {
int counter = 0;
vector<char*> str_vec;
// Copy argument string to get rid of const modifier
char arg_str[MAX_ARG_LEN];
strcpy(arg_str, args.c_str());
// Tokenize the string, splitting on spaces
char* token = strtok(arg_str, " ");
while (token) {
counter++;
str_vec.push_back(token);
token = strtok(NULL, " ");
}
// Allocate array
char** to_return = new char*[counter];
for (int ii=0; ii < counter; ii++)
to_return[ii] = str_vec[ii];
// Save arg count and return
argc = counter;
return to_return;
}
Полученный ARGC и ARGV затем передается в плагин, упомянутых выше.
Вы можете включать образец кода, чтобы сделать его проще для нас коллег-SO пользователей, чтобы понять, что вы делаете? – t0mm13b
Пример кода добавлен, он скелетный, потому что этот плагин довольно большой, но это дает вам суть проблемы. –
Я думаю, что мы можем сказать, какова природа проблемы, но вы оставили все, что могло бы помочь в отношении фактического источника проблемы. Есть миллион различных вещей, которые могут повредить этот массив, но вы оставили весь этот код. – SoapBox