0

Valgrind を実行して、コードのメモリ リークをチェックしています。Valgrind はリークが発生していることを示していませんが、リークを引き起こしていると思われるコードがあり、変数がどのようにクリーンアップされているのか、または Valgrind がそれをキャッチしていないのかわかりません。2 つの char* 配列でリークが発生しないのはなぜですか?

void BasicEngine::ConnectionInput(int ConnectionId, const char* ClientInput)
{

    // find client assignment to this ConnectionId
    Client* thisClient = this->ClientFind(ConnectionId);

    int SpaceLocation = strcspn(ClientInput," ");

    char* verb;
    char* args;

    if(SpaceLocation == strlen(ClientInput))
    {
        verb = (char*)ClientInput;
        args = (char*)"";
    }
    else
    {
        verb = new char[SpaceLocation+1];
        args = new char[strlen(ClientInput)-SpaceLocation+1];

        sscanf(ClientInput,"%s %[^\n]",verb,args);
    }


    if(thisClient != NULL)
    {    
       // ... client is always null, this is not being reached at the moment.
    }
    else   
    {
        if(this->refCmdHandler != NULL)
         if(this->refCmdHandler->cmdHandler(ConnectionId,ClientInput))
            return;
    }

    this->refServer->TransmitNL(ConnectionId,"Invalid Command.");

}


bool BasicCmdProc::cmdHandler(int ConnectionId, string ClientInput)
{
    Transmit(ConnectionId,string("You Said: ") + ClientInput);

    return true;
}

「こんにちは」と入力すると

出力は次のとおりです。

漏れは検出されません。

4

3 に答える 3

3

helloスペースが含まれていないため、strcspn戻りstrlen(ClientInput)、最初の分岐を取ります。そのブランチでverbargs、動的に割り当てられないため、リークはありません。

ただし、変数を解放する必要があるかどうかを判断するのが難しくなるため、「多分割り当てられた」メモリに変数ポイントを持つことは通常非常に危険であることに注意してください。したがってnew、両方のブランチで使用し、最後に両方の変数を無条件に解放する必要があります。または、さらに良いのは、 std::strings を使用して、この問題を完全に回避することです。

于 2013-02-09T23:48:45.660 に答える
0

入力が次の理由である場合、2 つのchar *要素verbsまたはどちらもargs割り当てられません。hello

int SpaceLocation = strcspn(ClientInput," ");

char* verb;
char* args;

if (SpaceLocation == strlen(ClientInput))
{
    verb = (char*)ClientInput;
    args = (char*)"";
}
else
{
    verb = new char[SpaceLocation+1];
    args = new char[strlen(ClientInput)-SpaceLocation+1];

    sscanf(ClientInput,"%s %[^\n]",verb,args);
}

strcspn(ClientInput, " ")、別名からの出力SpaceLocationは と同じstrlen(ClientInput)であるため、new[]操作は実行されず、メモリは割り当てられません。

リリースする必要があるかどうかをどのように判断verbargsますか? メモリを解放するかどうかわからないのは危険です。

于 2013-02-09T23:47:57.507 に答える
0

2 つの char* 配列でリークが発生しないのはなぜですか?

それらは、演算子の結果をそれらに割り当てた場合にのみ行わnewれます (この場合、Valgrind は通知する必要があります)。それらに定数文字列を割り当てると、メモリがリークすることはありません。定数文字列は、プログラムの存続期間全体で生きています。

于 2013-02-09T23:48:35.870 に答える