-1

我有以下将对插入 STL 映射的函数。我需要在插入之前使用 new 分配内存吗?

char* foo(char* lnumber)
{

       char* sData = “A,B,C”;
       Char delim[] = “,”;                       
       typedef std::map<std::string, std::string> TStrStrMap; 
       typedef std::pair<std::string, std::string> TStrStrPair;
       TStrStrMap tMap;

       if(strstr(sData,delim) != 0)
       {
          tok = strtok( sData, delim);
          while( ( tok != NULL))
          {
             int bytes = strlen(tok)+1;
             char* ll = new char[bytes];
             memset(ll,0,bytes);
             strcpy(ll,tok);
             ll[bytes] = '\0';
             int bytes1 = strlen("yes")+1;
             char* ll1 = new char[bytes1];
             memset(ll1,0,bytes1);
             strcpy(ll1,”yes”);
             ll1[bytes1] = '\0';
             tMap.insert(TStrStrPair(ll,ll1));
             tok = strtok( NULL, delim);
          }
        }

        std::string strValue = tMap[lnumber];
        return(strdup(strValue.c_str()));
}
4

1 回答 1

2

要回答您的具体问题 - 不,鉴于您显示的声明,您不需要自己分配内存。 std::string将管理字符串值的内存,std::pair将处理其std::string值的内存,std::map并将处理其值的内存std::pair

您当前的代码正在泄漏char[]您使用“new []”分配的每个缓冲区。您的std::string价值观正在制作数据的副本,因此您在delete[]使用完它们时需要它们,例如:

char* foo(char* lnumber)
{
    char sData[] = "A,B,C";
    char *delim = ",";                       
    typedef std::map<std::string, std::string> TStrStrMap; 
    typedef std::pair<std::string, std::string> TStrStrPair;
    TStrStrMap tMap;

    if(strstr(sData, delim) != 0)
    {
        char *tok = strtok(sData, delim);
        while (tok != NULL)
        {
            int bytes = strlen(tok)+1;
            char* ll = new char[bytes];
            strcpy(ll, tok);
            int bytes1 = strlen("yes")+1;
            char* ll1 = new char[bytes1];
            strcpy(ll1, "yes");
            tMap.insert(TStrStrPair(ll,ll1));
            delete[] ll; // <-- here
            delete[] ll1; // <-- here
            tok = strtok( NULL, delim);
        }
    }

    std::string strValue = tMap[lnumber];
    return strdup(strValue.c_str());
}

话虽如此,由于std::string有一个接受char*输入的构造函数,因此您的循环代码可以大大简化为以下内容:

// you really should be using std::string instead
// of char* for the function's input and output...
//
char* foo(char* lnumber)
{
    char sData[] = "A,B,C";
    char *delim = ",";                       
    typedef std::map<std::string, std::string> TStrStrMap; 
    typedef std::pair<std::string, std::string> TStrStrPair;
    TStrStrMap tMap;

    char *tok = strtok(sData, delim);
    while (tok != NULL)
    {
        tMap.insert(TStrStrPair(tok, "yes"));
        tok = strtok(NULL, delim);
    }

    std::string strValue = tMap[lnumber];
    return strdup(strValue.c_str());
}
于 2012-11-02T00:30:03.000 回答