3

渡す必要のある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*配列を生成するにはどうすればよいですか(これは戻る前に削除する必要があるため)メモリリークを回避するための関数から)。

4

3 に答える 3

3

の宣言から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++ の禁欲主義者でない限り、最初の解決策には何の問題もありません。return toRet ;(ただし、! にはステートメントが必要genArgsです)。

于 2012-05-03T12:56:49.383 に答える
2

これは、メモリ リークを避けるために、関数から戻る前に削除する必要があります。

これは完全に正しいわけではありません: 最終的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;
于 2012-05-03T12:47:34.357 に答える
0

通常の方法は、配列の有効期間を管理するオブジェクト ( astd::vector<char*>や aなど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());
于 2012-05-03T12:48:18.620 に答える