【发布时间】:2015-07-10 21:01:01
【问题描述】:
所以我在这个例子中有 2 个类:E,当它被销毁时打印一条消息 + 可以存储整数值T,它存储E 的实例并可以返回它通过方法
代码:
class E
{
public:
E();
~E();
int test;
};
E::E(){}
E::~E()
{
std::cout << "E is destroyed" << std::endl;
}
///////////////////////////////////////////
class T
{
public:
T();
~T();
E data;
E get();
};
T::T(){}
T::~T(){}
E T::get()
{
return this->data;
}
///////////////////////////////////////////
int main()
{
E e;
e.test = 2;
T t;
t.data = e;
E* e2;
{
e2 = &(t.get());
std::cout << "end of block" << std::endl;
}
std::cout << e2->test;
}
运行我的代码的结果是:
E is destroyed
end of block
这意味着E 的某些实例在到达{} 的末尾之前被销毁
问题:
1.我做了一点实验。 e2 = &(t.get()); 行中的 t.get() 值是否正确,因为它没有按值分配给任何变量?
2.如果这个值被破坏,那意味着e2指针无效。但是std::cout << e2->test; 行仍然打印保存的整数值。指针是否仍然有效,或者这些数据只是偶尔停留在这个内存位置?
【问题讨论】:
-
是的,你有一个dangling pointer 指向一个超出范围的变量。在此之后尝试对该对象执行任何操作都是未定义的行为。
-
请注意,如果您的函数具有签名
E& T::get(),您将返回对仍在范围内的data的引用,这样就可以了。问题是您按值返回了E,这是一个立即被销毁的临时值。 -
@Cyber,是的,我就是这么想的,谢谢。我读过一些关于临时工的东西,但不确定这是否完全是关于我的情况。那么,我对此是否正确:如果临时通过值立即分配给某物,它肯定不会被销毁,是吗?