2012-05-03 10 views
3

私はchar* arguments[]を渡す必要があるC++関数を持っています。次のようにこの関数のプロトタイプは次のとおりです。 void somefunc(char* arguments[])関数からchar *ポインタの配列を生成

この関数に上記の配列を渡すために、私は私にこのchar* array出力を返すことができます別の関数からこの配列を生成していますが、これは、このようsomehwhatに見えます。 genArgs(3, a.c_str(), b.c_str(), c.c_str())またはgenArgs(2, a.c_str(), b.c_str())私は文字を使用せずに上記のchar *の配列を生成するにはどうすればよい
*:

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

は、私が実際に私のようなものを関数への入力を渡すことになることを考えると、正しく上記の関数を作成する方法を混乱しています*(これはメモリリークを避けるために関数から戻る前に削除する必要があるからです)。それは本当ですが、あなたはnew[]に割り当てられ、最終的delete[]へのポインタが必要なこと:

答えて

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++でない限り、最初のソリューションには何の問題も、実際にはありません。 (ただし、genArgsreturn toRet ;の文が必要です)

2

これは持っているでしょうが、メモリを避けるために、関数から戻る前に、削除するには、これは完全に間違ってい

を漏らします割り当てが発生した機能を終了する前に必ずしも実行する必要はありません。あなたがこれを行うことができます

// 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; 
+0

返されたデータを削除するのは、呼び出し元が責任を負う "genArgs"契約(ヘッダー記述)に入れてください。このように考えると、独自のmalloc関数を作成しています! – jiveturkey

0

を通常の方法は、なるように((例えば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()); 
関連する問題