2012-11-02 88 views
-1

我有以下功能,將對插入到STL地圖。在插入前是否需要使用新分配內存?在插入C++ 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())); 
} 
+0

在插入之前,不需要新建內存。 STL將分配內存並將對象複製到容器中。 – billz

+2

恐怕,這些代碼中的大部分都沒什麼意義。爲什麼不寫沒有任何指針或「新」的真正的C++? –

+0

也許你應該改變你的問題,問如何正確地做到這一點。 – Jason

回答

2

要回答你的具體問題 - 不,你不需要根據你已經顯示的聲明自己分配內存。 std::string將管理字符串值的存儲器,std::pair將處理其std::string值的存儲器,並且std::map將處理其std::pair值的存儲器。

您當前的代碼正在泄漏您正在使用'new []'分配的每個char[]緩衝區。你std::string值使數據的副本,所以你需要delete[]他們whenyou與他們所做的,如:

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()); 
} 
+0

或者,用更多的C++:http://coliru.stacked-crooked.com/a/2528388ba47e0736 –

相關問題