2016-03-27 3 views
2

次のコードは、xxx行だけが出力された(つまり、 "pre concat"の前に)セグメンテーションフォルトを生成します。C++演算子+ string longがセグメンテーションフォールトを生成する

cerr << "xxx + " << ((long long) timev); 
string cname = "MyKey" + ((long long) timev); 

string operator+(const string& str, long long nr) { 
    cerr << "Pre concat "; // << str << "$" << nr; 
    stringstream ss; 
    ss << str << nr; 
    cerr << "Post concat"; 
    return ss.str(); 
} 

何故でしょうか?

(私はこれで間違っているものを見ることができれば、私はちょうどそれが他のモジュールと競合する可能性があるとして、おそらく悪い考えである標準タイプの演算子をオーバーロードし、メソッドを使用します。しかし、のろわれます。)

+0

const char* key = "MyKey"; string cname = key + ((long long) timev); // or key[((long long) timev)] 

できtimev' 'の宣言は何ですか? – Maikel

+0

'std :: cout <<" MyKey "+ 2;'の出力を見てください。前の行で '<<'の代わりに '+'を使用した場合は、問題を発見したでしょう。 – molbdnilo

+0

デバッガの使用方法を学びます。 –

答えて

6

"MyKey"std::stringではありません。それはconst char[6]です。 "MyKey" + ((long long) timev)の場合、オーバーロード演算子は呼び出されません。代わりに"MyKey"const char*に減衰し、次に"MyKey" + ((long long) timev)が配列の境界から外れる可能性があります。これはUBです。

コードが通り同等です:あなたは

string cname = string("MyKey") + ((long long) timev); 
+1

@juanchopanza OP定義済みです。それは受け入れられないのですか? – songyuanyao

+0

ああ、そうです。いいえ、私はそれが許されているとは思わない。 – juanchopanza

+0

@juanchopanzaだから私の最初のquesiontに戻る。標準のlib型のオーバーロードは許可されていませんか? (私はこれについていくつかの問題を知っています(例えば、ユーザータイプに対してのみ許可されているstlテンプレート指定など、ここではこの問題はありますか?) – songyuanyao

関連する問題