2013-07-31 48 views
2

我正在做一些矩阵类,我想知道什么时候创建一个临时对象,它是本地的功能权?所以它应该在函数返回时超出范围,但我不知道为什么在这种情况下不会发生这种情况,我可以在函数返回后使用它。使用const引用时创建临时变量

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

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

,这里是我如何使用它:

Matrix3 m = { {1,2,3,4,5,6,6,6,6} }; 

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

+1

数据在类的实例中,只要实例处于活动状态,您可以访问它 – aaronman

+0

因此,如果我没有将其分配给数据,它会继续存在,直到类被销毁? –

+0

如果我明白你的意思是 – aaronman

回答

2

临时端中的陈述或声明的介绍了它,而不是在的最后的分号寿命功能。 (否则,无害循环,易引起堆栈溢出。)

如果您使用的对象引用其生命周期结束后(这里的阵列,例如),那么你得到未定义行为。 C++不会跟踪死对象,以告诉您何时使用死对象。你碰巧从死亡数组中找到信息。但是别的东西可能会重用内存,或者它可能已经返回到系统,并且可能会出现段错误。

避免悬挂引用和指针。不要认为,如果它在测试案例中起作用,那它在现场工作。

+0

@aaronman命名对象在超出范围时被销毁(在块的结尾或程序终止时)。未命名的对象,又名临时对象,在声明结束时销毁,除非声明是对临时声明的参考声明。 – Potatoswatter

+0

哦,我的坏,我想到的名字变种不是临时工,在这个问题的代码必须困惑我:) – aaronman

0

执行完行后,临时数组被破坏,数据指针变为无效。

+0

所以这只是这个内存不被任何部分使用或尚未?为什么我仍然可以从析构函数中获取它,这是我的观点? –

0
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