从函数生成 char* 指针数组
Generate an array of char* pointers from a function
我有一个C++函数,我必须传递给它char* arguments[]
。此函数的原型如下: void somefunc(char* arguments[])
为了将上面的数组传递给这个函数,我从另一个函数生成这个数组,它可以向我返回这个char* array
输出,这看起来有点像这样。
char** genArgs(int numOfArgs,...)
{
va_list argList;
char** toRet = new char*[numOfArgs];
va_start (arguments, numOfArgs);
for(int cnt = 0; cnt < numOfArgs ; ++cnt)
toRet[cnt] = va_arg(argList, char*);
va_end(arguments);
}
我很困惑如何正确编写上述函数,因为我将传递输入以类似:genArgs(3, a.c_str(), b.c_str(), c.c_str())
或genArgs(2, a.c_str(), b.c_str())
如何在不使用 char** 的情况下生成上述 char* 数组(因为在从函数返回之前必须将其删除以避免内存泄漏)。
从你的genArgs
声明来看,似乎每当你调用genArgs
时,你都知道你想传递多少个参数。这是对的吗?如果是这样(并且如果您使用的是C++11
),则可以在调用函数中使用std::array
。所以取而代之的是:
char** arglist = genArgs (4, "MyArg1", mYaRG2", "LastArg", 0) ;
somefunc (arglist) ;
delete[] arglist ;
你可以这样做:
#include <array>
std::array<char*, 4> arglist { "MyArg1", mYaRG2", "LastArg", 0 } ;
somefunc (&arglist[0]) ;
但是第一个解决方案真的没有错,除非你是一个C++苦行者。(但是,您确实需要genArgs
中的return toRet ;
语句!
在从函数返回之前必须将其删除以避免内存泄漏
这并不完全正确:尽管您确实需要最终delete[]
您分配的指针 new[]
,您不一定必须在退出发生分配的函数之前执行此操作。
您可以这样做:
// This allocates args; we now own the pointer
char **argsToPass = genArgs(2, a.c_str(), b.c_str());
// Make the call as usual
somefunc(argsToPass);
// Now that args are no longer needed, we delete them:
delete [] argsToPass;
通常的方法是使用管理数组生存期的对象(例如std::vector<char*>
或std::unique_ptr<char*[]>
),然后返回该对象(以便类型系统保证内存的最终释放):
std::vector<char*> genArgs(int numOfArgs,...)
{
std::vector<char*> toRet;
toRet.reserve(numOfArgs);
va_list argList;
va_start(argList, numOfArgs);
for(int cnt = 0; cnt < numOfArgs ; ++cnt) {
toRet.push_back(va_arg(argList, char*));
}
va_end(arguments);
return toRet;
}
要使用此功能,请执行以下操作:
somefunc(&genArgs(3, a.c_str(), b.c_str(), c.c_str()).front());
相关文章:
- 指向指向字符数组的指针数组的指针
- 通过指向指针数组的指针访问子类的属性
- C++,指针数组,指向双链表中的条目
- 在C++中,如何初始化指向wchar_t*的指针数组(生成wchar_t**)
- C++从函数指针数组调用函数
- 关于指向指针数组的指针
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 将链表转换为指针数组时出错
- C++ 对象指针数组的复制构造函数
- C++ - 循环访问指针数组会导致错误
- 删除指针数组 (C++) 中的元素
- 如何循环访问 cpp 中的函数返回的字符指针数组
- 将函数指针数组中的函数指针作为模板参数传递
- Google Or-Tools Glop:如何创建指向 const 对象的指针数组?
- 具有推导参数的模板函数指针数组变量
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- C++指针数组到字符数组中的特定位置
- 如何在C++中复制指针数组的数据
- 初始化类中的指针数组,并在另一个类中检索它
- 尽管直接设置了指针数组,但仍为空