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

Чтобы убедиться, что приведенный выше код приводит к неопределенному поведению, поскольку мы сохраняем адрес временного пространства?rvalue reference und неопределенное поведение

ответ

2

Объявление указателя на структуру Test* ptr; или «Сохраняющий адрес», как вы его называете, не приводит к неопределенному поведению. Использование указателей на объекты, срок жизни которых закончился.

Срок действия объекта, созданного Test(), заканчивается main, заканчивается сразу после f(Test());. После этого все, что вы делаете, используя ptr, не определено. Этот объект, скорее всего, остается в памяти даже после его окончания жизни, но вы не должны полагаться на него.

Вы также должны проверить: What are all the common undefined behaviours that a C++ programmer should know about?

1

Да, временный Test() выделен в стеке, вы берете указатель на него, и после его вызова вызывается деструктор. После этого значение указателя остается в силе, но оно указывает на «неопределенную» память, поэтому все ставки отключены на разыменованием указателем.

Смежные вопросы