【发布时间】:2016-10-12 02:37:32
【问题描述】:
鉴于此代码:
#include <iostream>
using namespace std;
class samp
{
int i;
public:
samp(int i)
{
this->i=i;
}
void show()
{
cout << "Sample" <<" "<<i <<endl;
}
};
int main()
{
samp* ptr ;
for(int i=0;i<10;i++)
{
ptr = new samp(i);
ptr->show();
delete ptr;
}
ptr->show();
return 0;
}
ptr 被定义为指向 10 个不同的 samp 类型对象。我知道删除它后,无法保证获得所需的输出。但是一次又一次地运行这个程序表明ptr仍然指向第一个对象,最后一个ptr->show()(return语句之前的语句)给出:
Sample 0
但在循环的最后时刻,ptr 指向第 10 个对象,所以应该是最后一个 ptr->show()(return statement 之前的语句)应该给出:
Sample 9
为什么它仍然给Sample 0而不是Sample 9?
【问题讨论】:
-
您试图推理未定义的行为。没有用。行为会随着编译标志、编译器、星期几等的变化而变化。
-
“我知道删除它后无法保证获得所需的输出”......那么,问题是什么?
-
在这种情况下,
i可能会被归零,这让你认为最后一个show()正在作用于第一个对象的内存,当它真的不是。如果show()打印出其this指针的值,您会看到最后一个show()作用于最后一个对象的内存,而不是第一个对象。最后一个show()打印i的值是未定义行为,因为this未指向有效对象,但打印this本身的值不是未定义行为。
标签: c++ class pointers object dynamic-memory-allocation