0

在我到处寻找这个问题的答案的地方,我看到人们制作了一个大小为 2 的小 char * 数组,并在 execv 的路径中进行了硬编码。我需要做的是将带有路径的参数字符串作为第一组字符,将它们标记化,然后将它们放入 execv 将接受的 char *s 数组中。

这是我的标记化功能

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);

在我的 fork() if-else 语句的 Child 部分中进行流控制。我收到一个 bad_alloc 错误,但我不确定我的哪些分配语句是正确的,如果有的话。我知道退货必须是表格

 char *const argv[]

但我不确定如何设置。

4

1 回答 1

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将替换您的可执行文件并有效地释放内存。

于 2015-10-02T20:00:41.957 回答