2012-02-19 85 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(); 
} 

可以肯定的是,上面的代碼導致了一個未定義的行爲,因爲我們保留了臨時地址?右值引用未定義的行爲

回答

2

聲明指向結構Test* ptr;的指針「保留地址」,因爲您稱之爲不會導致未定義的行爲。使用指針指向其生命週期結束的對象。

main創建的對象的生存期在f(Test());執行後立即結束。之後,無論你使用ptr做什麼都沒有定義。即使在它的生命週期結束後,這個對象也很可能留在內存中,但你不應該依賴它。

您還應該看看:What are all the common undefined behaviours that a C++ programmer should know about?

1

是的,暫時的Test()被分配到堆棧上,你得到一個指針並且它的析構函數在返回後被調用。之後,指針的值仍然有效,但它指向「未定義」的內存,所以所有投注均取消取消引用指針。