右值引用未定义的行为
rvalue reference undfefined behavior
#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();
}
可以肯定的是,上面的代码会导致未定义的行为,因为我们保留临时地址?
声明
指向结构Test* ptr;
的指针或您所说的"保留地址">不会导致未定义的行为。使用指向生存期已结束的对象的指针可以。
Test()
在 main
中创建的对象的生存期在执行 f(Test());
后立即结束。之后,无论您使用 ptr
执行什么操作都是未定义的。即使此对象的生存期已结束,此对象也很可能保留在内存中,但您不应依赖它。
您还应该查看:C++程序员应该了解的所有常见的未定义行为是什么?
是的,临时 Test(( 是在堆栈上分配的,你拿一个指向它的指针,它的析构函数在返回后被调用。之后,指针的值仍然有效,但它指向"未定义"的内存,因此所有赌注都在取消引用指针时关闭。
相关文章:
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 对 Scalar ::Scalar() 的未定义引用
- 对复制 CTOR 和 CTOR 的未定义引用
- 对显式实例化的模板函数的未定义引用
- TensorRT (C++ API) 对"createNvOnnxParser_INTERNAL"的未定义引用
- 2个模板化类的非模板友元函数未定义引用错误
- 编译 libfluid 样本控制器时对"event_base_del_virtual"的未定义引用
- 获取对function_name的未定义引用
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 对结构方法的未定义引用
- 使用内联函数 c++ 的未定义引用
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 对 DLOPEN 的未定义引用
- QT C++中对全局变量的未定义引用
- 快速数学导致对"__pow_finite"的未定义引用
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用