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