2013-06-23 29 views
4

在我的課堂我有一個成員這會損壞堆棧使用本地變量?

std::vector<std::pair<std::string, std::string> > mEnvironment; 

現在我寫它加載該向量與過程環境鍵/值對的函數。我不需要訪問成員,所以我不使用地圖,並且認爲矢量會更好,因爲我只是遍歷它。

void Environment::setEnvironment(char const *oEnvironment[]) 
{ 
    mEnvironment.clear(); 
    if(oEnvironment == NULL) 
     return; 

    std::string name; 
    std::string value; 
    std::pair<std::string, std::string> entry; 
    for(const char **envp = oEnvironment; *envp != NULL; envp++) 
    { 
     const char *env = *envp; 
     name.clear(); 
     value.clear(); 

     for(env = *envp; *env != 0; env++) 
     { 
      if(*env == '=') 
      { 
       env++; 
       break; 
      } 

      name += *env; 
     } 

     value = env; 

     entry = std::make_pair(name, value); 
     mEnvironment.push_back(entry); 
    } 
} 

由於變量entry是本地的,我不知道用push_back(entry)時會發生什麼功能超出範圍。將我放入向量中的對象繼續存在,還是會調用析構函數?或者更糟的是,它會被簡單地覆蓋,還是我必須在循環中創建一個新的對象?

回答

2

沒有什麼不好的事情會發生,因爲向量創建了對(以及其中的每個字符串)的副本。

來支持這一行動,下面是標準的相關報價(C++ 11,§23.2.3,在大表738頁上的正式版):

a.push_back(t) [。 ..]追加t // 要求:TCopyInsertable轉換爲X

這裏,X代表矢量類型,tT類型的左值或恆定右值,這是部件元素的類型。所以這適用於你的情況。 (如果這個對是在動態創建的,也就是在push_back(...)函數調用中創建的,那麼你會有一個臨時右值,這意味着一個不同的表格行將適用,你會得到一個移動而不是副本,但會有仍然沒有任何問題。)

向量存儲其元素的副本。 (當你有一個向量的元素類型被定義爲一個指針類型,或者某個具有指針成員的結構體或類時,存在唯一的危險。當然,該向量只複製指針的副本,而不是內容的深層副本;或者在結構或類類型的情況下,使得通過複製該數據類型的拷貝構造函數定義但對於std::string一個std::pair,預期都將工作)

+1

感謝。我不確定這些類真的做了什麼,但我想,如果他們不創建副本,這是沒有意義的。雖然想確定。 :) – Devolus