以下是否会继续工作?
class MyCLass {
int *pInt;
public:
MyCLass() {
pInt = new int;
*pInt = 42;
}
~MyCLass() {
delete pInt;
printf("Goodbye cruel world!");
}
void func1() {
printf("Hello World %d", *pInt);
}
};
MyCLass foo;
{
MyClass &bar = foo;
//Do stuff
}
foo.func1();
我担心完全模仿原始对象bar
的任务将导致析构函数超出范围时调用它。
答案 0 :(得分:3)
不,不会。在您的示例中,存储与foo完全相关。当foo超出范围时,析构函数将被调用。
当然,如果您仍然有对该对象的引用,那么引用将引用一个现在不存在的对象,这可能会给您带来问题。
引用不会模拟原始对象。它所做的就是说,当该对象存在时,通过引用的任何调用都将被重定向到该对象。
答案 1 :(得分:1)
对象的引用和(原始)指针不管理它的生命周期。因此,当任何一个超出范围时,真实对象将不会被销毁。否则,您无法创建对stackallocated对象的引用或指针,因为它们会被多次销毁(当引用/指针超出范围时以及对象本身超出范围时)。在我看来,理解c ++引用的最简单方法是将它们视为无法重新分配的指针,并且每次访问都会自动取消引用(基本上是语法糖来隐藏程序员的指针)。
作为旁注,你的代码不正确c ++。 MyCLass foo = new MyClass()
声明类型为MyClass
的(stackallocated)对象,但尝试将new MyClass()
的结果分配给它,它是指向类型为MyClass
的堆分配对象的指针。初始化foo
的正确方法是MyClass foo;