Оболочка C ++ в Unix, execv: динамически создавать и возвращать второй используемый параметр из функции

Везде, где я искал ответы на этот вопрос, я вижу людей, которые создают один маленький массив 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[]

Но я не уверен, как это настроить.

0

Решение

Вы возвращаете память из локальной переменной (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 заменит ваш исполняемый файл и эффективно освободит память.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]