-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 に答える