Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 右值引用未定义的行为 #包括 结构测试 { int n; ~Test(){} 测试和运算符=(int v) { n=v; 归还*这个; } }; Test*ptr=nullptr; 无效g(测试和处理) { std::cout_C++ - Fatal编程技术网

C++ 右值引用未定义的行为 #包括 结构测试 { int n; ~Test(){} 测试和运算符=(int v) { n=v; 归还*这个; } }; Test*ptr=nullptr; 无效g(测试和处理) { std::cout

C++ 右值引用未定义的行为 #包括 结构测试 { int n; ~Test(){} 测试和运算符=(int v) { n=v; 归还*这个; } }; Test*ptr=nullptr; 无效g(测试和处理) { std::cout,c++,C++,是的,临时Test()是在堆栈上分配的,您获取指向它的指针,并在返回后调用它的析构函数。之后,指针的值仍然有效,但它指向“未定义”内存,因此取消引用指针时所有赌注都无效。将指针声明为structTest*ptr;或您所称的“保留地址”不会导致未定义的行为。使用指向生命周期已结束的对象的指针会导致未定义的行为 由Test()在main中创建的对象的生存期在执行f(Test());后立即结束。在此之后,使用ptr执行的任何操作都是未定义的。该对象很可能在其生存期结束后仍保留在内存中,但您不应该依赖它

是的,临时Test()是在堆栈上分配的,您获取指向它的指针,并在返回后调用它的析构函数。之后,指针的值仍然有效,但它指向“未定义”内存,因此取消引用指针时所有赌注都无效。

将指针声明为struct
Test*ptr;
或您所称的“保留地址”不会导致未定义的行为。使用指向生命周期已结束的对象的指针会导致未定义的行为

Test()
main
中创建的对象的生存期在执行
f(Test());
后立即结束。在此之后,使用
ptr
执行的任何操作都是未定义的。该对象很可能在其生存期结束后仍保留在内存中,但您不应该依赖它

您还应查看:

#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(); 
}