在使用C++工作了15年后,我发现自己并没有完全理解引用。
class TestClass
{
public:
TestClass() : m_nData(0)
{
}
TestClass(int n) : m_nData(n)
{
}
~TestClass()
{
cout << "destructor" << endl;
}
void Dump()
{
cout << "data = " << m_nData << " ptr = 0x" << hex << this << dec << endl;
}
private:
int m_nData;
};
int main()
{
cout << "main started" << endl;
TestClass& c = TestClass();
c.Dump();
c = TestClass(10);
c.Dump();
cout << "main ended" << endl;
return 0;
}
// prints:
// main started
// data = 0 ptr = 0x0012FF54
// destructor
// data = 10 ptr = 0x0012FF54
// main ended
// destructor
我从这个测试中了解到
TestClass
实例是在堆栈上创建并由第一个TestClass
构造函数初始化(这正确吗?). 这个实例是什么时候分配的:当main
函数被加载还是当引用赋值被执行?它是什么时候销毁的?在第二个引用赋值之后,对象地址没有改变。这是否意味着析构函数和构造函数适用于同一内存区域?还是内存被释放(动态地?在堆栈上?)然后重新分配?
我知道关于堆栈和堆分配对象的生命周期,它们的构造函数和析构函数,但我无法理解这个程序中具体发生了什么。
编辑:感谢大家。我试图在这个测试中复现其他(更复杂)程序的行为。你们的评论帮助我理解了我的错误和另一个我正在与之斗争的程序...
修正后的代码如下:
int main()
{
cout << "main started" << endl;
TestClass t;
TestClass& c(t);
c.Dump();
c = TestClass(10);
c.Dump();
cout << "main ended" << endl;
return 0;
}
注意:2022年6月29日更新:由于丹尼尔·沃克最新的编辑,这个问题看起来像是一堆废话。本人不对此负责。
alloca()
实现的源代码带有与此兼容性的痕迹。 - Cubbi