私は自分のプロジェクト (Linux で実行中) にプラグイン システムを持っています。これの一部は、プラグインに次のような「実行」メソッドがあることです。
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]);
}
}
これは、Python に公開するシステムにリンクされているため、これらのプラグインを Python 関数として呼び出すことができます。だから私は自分のpython関数に文字列パラメータを取り、それを次のように分割します:
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 は、上記のプラグインに渡されます。