从函数生成 char* 指针数组

Generate an array of char* pointers from a function

本文关键字:指针 数组 char 函数      更新时间:2023-10-16

我有一个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());