Везде, где я искал ответы на этот вопрос, я вижу людей, которые создают один маленький массив char * размером два и жестко кодируют пути для execv. Что мне нужно сделать, это взять строку параметров с путем в качестве первого набора символов, разбить их на токены, а затем поместить их в массив символов *, которые execv примет.
вот моя функция токенизации
char ** stringToVectorToCharArray(string inputString)
{
stringstream ss(inputString);
cout << "\n inputString is: " << inputString <<"\n";
vector<string> tokens;
tokens.clear();
while(ss >> inputString)
{
tokens.push_back(inputString);
}int size = tokens.size();
char **args = new char*[size + 1];
int i = 0;
for(; i < size; i++)
args[i] = const_cast<char *>(tokens.at(i).c_str());
args[i + 1] = (char *) 0;
return args;
}
И это называется из
char **args = stringToVectorToCharArray(inputString);
execv(executeChar, args);
В разделе Child моего оператора fork () if-else для управления потоком.
Я получаю ошибку bad_alloc, но я не уверен, какие из моих операторов распределения правильны, если таковые имеются по этому вопросу. Я знаю, что возвращение должно быть в форме
char *const argv[]
Но я не уверен, как это настроить.
Вы возвращаете память из локальной переменной (tokens
) от вашей функции.
for(; i < size; i++) {
// stores pointer to local memory: args[i] = const_cast<char *>(tokens.at(i).c_str());
args[i] = new char[tokens.at(i).size()+1]; // Create dynamically allocated copy
strcpy(args[i], tokens.at(i).c_str());
}
Вышесказанное должно решить проблему. Технически это приведет к утечке памяти, поскольку память никогда не освобождается, но ваш вызов execv
заменит ваш исполняемый файл и эффективно освободит память.
Других решений пока нет …