2016-12-16 2 views
0

最近解決されたバグがありましたが、その理由を理解したいと思います。私はC++ 11を使ったcmakeプロジェクトを持っています。なぜオブジェクトへのポインタを返すのはいつかしか動作しませんか?

これはmac osxでは動作しますが、ubuntuでは動作しません。 ubuntuではnullを返します。

obj *getPointer(){ 
    obj test = obj(1,2,3); 
    return &test; 
} 

これは両方で動作します:あなたが出口で破壊されautomatic storage durationを持つローカルオブジェクトobj testのアドレスを返却するよう

obj *getPointer(){ 
    obj* ptr; 
    obj test = obj(1,2,3); 
    ptr = &test 
    return &ptr; 
} 
+0

警告をエラーとして有効にし、コンパイルしていないことを確認する必要があります。 –

答えて

11

あなたのインスタンスの両方が、未定義の動作(UB)を呼び出しますあなたはぶら下がりポインタで終わるので、関数から。それはちょうど "働く"ことが起こるが、何かが起こる可能性があるので、あなたはUBをどうしても避けてください!

なぜ機能しているのか理解するためには、おそらく機能の終了時に関数のスタックがまだOSによって再利用されていないため、ぶら下がりポインタが同じデータを指しているからです。

This answer~Can a local variable's memory be accessed outside its scope?は、私がこれまで指摘してきた最良の説明の1つを提供しています。

+0

正しい方法は何ですか? mainのような呼び出し元関数からテストobjを渡すべきですか?または私は新しいキーでオブジェクトを作成し、すべてが別の関数で完了したら削除する必要がありますか? – Nick

+1

@ニック 'new'で作成し、' delete'で解放する必要があります。または、スマートポインタ(https://en.wikipedia.org/wiki/Smart_pointer)を使用してください。 – vsoftco

+3

@ニック私は値で返すようにして、コンパイラにコピーを削除させるべきだと思います。 –

関連する問題