C++ 使用常量引用时创建的临时变量

C++ 使用常量引用时创建的临时变量,c++,C++,我正在创建一些矩阵类,我想知道当创建一个临时对象时,它是函数的局部对象,对吗?所以当函数返回时,它应该超出范围,但我不知道为什么在这种情况下不会发生这种情况,我可以在函数返回后使用它 下面是一个示例,这是构造函数: int *data; //member of class Matrix3(const int (&ar)[N*N]) { data = const_cast<int*>(ar); } 现在我仍然可以通过data指针从析构函数访问该对象,这正常吗?临时

我正在创建一些矩阵类,我想知道当创建一个临时对象时,它是函数的局部对象,对吗?所以当函数返回时,它应该超出范围,但我不知道为什么在这种情况下不会发生这种情况,我可以在函数返回后使用它

下面是一个示例,这是构造函数:

int *data;   //member of class
Matrix3(const int (&ar)[N*N])
{
    data = const_cast<int*>(ar);
}

现在我仍然可以通过
data
指针从析构函数访问该对象,这正常吗?临时变量是在堆上创建的吗

执行行后,临时数组将被销毁,数据指针将无效

int *data; // is a member, so it goes out of scope when the object is destroyed
但是,如果在如下函数中声明:

void someFunction() {

    int *data;


}

// pointer is lost now and is inaccessible 

临时函数的生存期在引入它的语句或声明的分号处结束,而不是在函数的末尾。(否则,无害循环很容易导致堆栈溢出。)

如果在对象的生存期结束后使用对对象的引用(例如此处的数组),则会得到未定义的行为。C++不跟踪死区对象,以便告诉你何时使用。您碰巧从死数组中找到了信息。但是其他一些东西可能会重复使用内存,或者它可能会返回到系统中,并且您可能会出现故障


避免悬挂引用和指针。不要假设如果它在测试用例中工作,那么它在字段中工作。

数据在类的实例中,因此只要实例是活动的,您就可以访问它。如果我没有将它分配给数据,它是否也会继续活动,直到类被销毁?如果我理解您所说的yesdata只是一个指针,数组存储在哪里???如果你看到数组仍然存在,那么它只是停留在内存中,还没有被覆盖。所以,只是这个内存还没有被任何部分使用,或者什么?为什么我仍然可以从析构函数访问它,这是我的观点?@aaronman命名对象在超出范围时(在块末尾或程序终止时)会被销毁。未命名对象,也称为临时对象,在语句末尾会被销毁,除非该语句是绑定到临时对象的引用的声明。哦,糟糕,我想到的是命名变量而不是临时对象,该问题中的代码一定让我困惑:)
void someFunction() {

    int *data;


}

// pointer is lost now and is inaccessible