2012-01-05 11 views
0

CodeC++地図EXC_BAD_ACCESS(アップルのみ)

Reads from

それが正常に動作します。しかし、XCode 4で実行すると、誰かがマップを読み込んだときに2回目の繰り返しでEXC_BAD_ACCESSを取得します(タイトルから「Load Map」を選択します)。

あなたはあなたのget_key_val機能は次のように起動し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

この問題のより簡単な例がありますか?あなたは人々に多くの読書や研究を依頼しています。 (あなたはまた、プロセスの問題を解決する可能性があります) –

+0

マット:はい、私は行とそれにリンクし、コードをコピーしてください、すみませます。 ドリュードーマンとサム・ミラー:私は試していましたが、それを再現することはできませんでした。私は、メインですべてをやりながら別の機能を追加していたからだと思いますが、今問題を知っているので再作成するのは簡単でしたが、今後の視聴者のために上記の編集を追加します。 –

答えて

2

でソースをダウンロードすることができます

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

それはこのように終わる:

return key_val; 
} 

あなたが戻っていますスタック変数へのポインタ。 key_val変数は関数からの復帰時に存在しなくなり、無効なポインタがあり、配列内の2つの文字列値が破棄されます。後続の動作は未定義です。

+0

ありがとう、私はこれを考慮して覚えているが、私はあまりにもイライラして忘れてしまったと思う。今私がやっているのは 'void Map :: get_key_val(std :: string * line、std :: string * key、std :: string * value);'それは "正しい"方法でしょうか? –

+0

これはうまくいく可能性があります。私は、void map :: get_key_val(std :: string const&line、std :: string&key、std :: string&value) 'の代わりに、これらのパラメータをポインタではなく参照渡しします。 –

0

C++ 11以降の移動セマンティクスでは、これを行う必要性は低くなります。あなたは単にstd :: stringを返すことができ、移動演算子は無駄なコピーを避けるべきです。