2012-02-19 4 views
1
#include<iostream> 

struct Test 
{ 
    int n ; 
    ~Test(){} 

    Test& operator =(int v) 
    { 
     n=v; 
     return *this; 
    } 
}; 

Test * ptr = nullptr; 

void g(Test && p) 
{ 
    std::cout << "&&"; 
} 


void g(Test & p) 
{ 
    ptr = &p; 
    std::cout << "&"; 
} 

void f(Test&& t) 
{ 
    g(t); 
} 

void buggy() 
{ 
    *ptr = 5; 
} 

int main() 
{ 
    f(Test()); 
    buggy(); 
    std::cin.ignore(); 
} 

ちょうど確かに、私達がテンポリーのアドレスを保つように上のコードは未定義の動作につながりますか?値の参照undfefinedの振る舞い

答えて

2

構造体へのポインタTest* ptr;または「アドレスの保持」を宣言しても、未定義の動作にはなりません。ライフタイムが終了したオブジェクトへのポインタを使用する

Test()によって作成されたオブジェクトの有効期間は、mainの直後に終了し、f(Test());の直後に終了します。その後、ptrを使って何をしても定義されていません。このオブジェクトは、その存続期間が終了した後でさえメモリ内にとどまる可能性が最も高いですが、それに頼るべきではありません。

またチェックアウトする必要があります。What are all the common undefined behaviours that a C++ programmer should know about?

1

はい、一時的なTest()はスタックに割り当てられ、ポインタを取得すると、デストラクタは返された後に呼び出されます。その後、ポインタの値は有効ですが、 "未定義"メモリを指しているので、すべてのベットは逆参照でオフになっています。

関連する問題