2012-01-05 56 views
0

CodeC++地圖EXC_BAD_ACCESS(只有蘋果)

Reads from

在Windows 7和8運行良好。但是,當在XCode 4中運行時,當有人加載地圖(從標題中選擇「加載地圖」)時,我會在第二次迭代中獲得EXC_BAD_ACCESS。

您可以用XCode project

#include <string> 
#include <map> 
#include <iostream> 

std::map <std::string, std::string> info;  

std::string* get_key_val(std::string* line) 
{ 
    std::string key_val[2]; 
    int start, end; 

    start = line->find_first_not_of(" "); 
    end = line->find_last_of(":"); 
    if(start == -1) 
    { 
     return NULL; 
    } 
    else if(end == -1) 
    { 
     return NULL; 
    } 
    else 
    { 
     key_val[0] = line->substr(start, end - start); 
    } 

    start = line->find_first_not_of(" ", end + 1); 
    end = line->find_last_of(" \n\r"); 
    if(start == -1) 
    { 
     return NULL; 
    } 
    else if(end == -1) 
    { 
     return NULL; 
    } 
    else 
    { 
     key_val[1] = line->substr(start, end - start); 
    } 

    return key_val; 
} 


void parse_from_line(std::string* line) 
{ 
    std::string* keyv = get_key_val(line); 
    if(keyv[0].empty() == false && keyv[1].empty() == false) info[ keyv[0] ] = keyv[1]; 
} 

int main(int argc, char* args[]) 
{ 
    std::string line = "name: Foo"; 
    parse_from_line(&line); 
    std::cout << "Hello " << info["name"].c_str(); 
} 
+0

有沒有更簡單的這個問題的例子?你要求人們做大量的閱讀和研究。 (你也可以在這個過程中解決問題) – 2012-01-05 17:10:34

+0

墊子:是的,我用線條鏈接到它,應該已經複製了代碼,對不起。 DrewDormann和Sam Miller:我一直在嘗試,但無法重現它。雖然我認爲這是因爲我在做主要事情而不是添加其他功能,現在很容易重新創建,我知道這個問題,我會繼續爲未來的觀衆添加一個上面的編輯。 – 2012-01-05 22:30:21

回答

2

get_key_val功能下載源開始是這樣的:

std::string* Map::get_key_val(std::string* line) 
{ 
    std::string key_val[2]; 

它結束這樣的:

return key_val; 
} 

你返回指向堆棧變量的指針。從函數返回時,key_val變量不再存在,因此您有一個無效的指針,並且數組中的兩個字符串值被銷燬。後續行爲未定義。

+0

謝謝,我記得考慮過這個,但覺得我太沮喪,忘了。現在我正在做的是無效的Map :: get_key_val(std :: string *行,std :: string * key,std :: string * value);'是那個「正確」的方式去做呢? – 2012-01-05 22:35:35

+0

這可以工作。儘管:'void Map :: get_key_val(std :: string const&line,std :: string&key,std :: string&value)'我會通過引用而不是指針傳遞這些參數。 – 2012-01-06 16:56:27

0

隨着C++ 11向前移動語義,它不需要這麼做。您只需返回std :: string,移動操作員應避免浪費任何副本。