2

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

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

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指针从析构函数访问该对象这正常吗?那么临时变量是在堆上创建的?!

4

3 回答 3

2

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

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

避免悬空引用和指针。不要假设如果它在测试用例中有效,那么它在现场也有效。

于 2013-07-31T01:33:41.920 回答
0

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

于 2013-07-31T01:27:39.360 回答
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 
于 2013-07-31T01:33:04.613 回答