0

我正在运行 Valgrind 来检查我的代码是否存在内存泄漏。Valgrind 没有显示任何泄漏发生,但我有一段代码我认为应该导致泄漏,我不明白变量是如何被清理的,或者 Valgrind 没有捕捉到它。为什么两个 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),因此您采用第一个分支。在那个分支中,verb并且args不是动态分配的,所以没有泄漏。

但是请注意,在“可能已分配”的内存中有一个变量点通常是非常危险的,因为很难确定是否应该释放该变量。因此,您应该new在两个分支中都使用,并在最后无条件地释放两个变量。或者,更好的是,使用std::strings 并完全避免这个问题。

于 2013-02-09T23:48:45.660 回答
0

为什么两个 char* 数组不会造成泄漏?

只有当您将new运算符的结果分配给它们时,它们才会这样做(在这种情况下,Valgrind 应该通知您)。如果您为它们分配常量字符串,那么就不会泄漏内存 - 常量字符串在程序的整个生命周期内都是活动的。

于 2013-02-09T23:48:35.870 回答
0

两个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, " ")akaSpaceLocation与 相同strlen(ClientInput),因此new[]不执行操作,也不分配内存。

您将如何判断是否需要释放verband args?不知道是否释放内存是危险的。

于 2013-02-09T23:47:57.507 回答