我正在创建一些矩阵类,我想知道什么时候创建一个临时对象它是函数的本地对象?所以当函数返回时它应该超出范围,但我不知道为什么在这种情况下不会发生这种情况我可以在函数返回后使用它。
这是一个例子,这是构造函数:
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
指针从析构函数访问该对象这是正常的吗?然后在堆上创建临时变量?!
答案 0 :(得分:2)
临时的生命周期以引用它的语句或声明的分号结束,而不是在函数的末尾。 (否则,一个无害的循环很容易导致堆栈溢出。)
如果在对象生命周期结束后使用对象的引用(例如此处的数组),则会得到未定义的行为。 C ++不会跟踪死对象,以便在您使用它时告诉您。您碰巧从死数组中找到了信息。但其他东西可以重用内存,或者它可能已经返回到系统中,你可能会遇到段错误。
避免悬挂引用和指针。不要以为如果它在测试用例中工作,它就可以在现场工作。
答案 1 :(得分:0)
执行行后,临时数组将被销毁,数据指针将变为无效。
答案 2 :(得分: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