在C ++中,如果我使用deallocating析构函数~MyClass引用一个对象,那么超出范围的引用是否会调用析构函数?

时间:2012-01-21 23:10:00

标签: c++ reference scope

以下是否会继续工作?

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的任务将导致析构函数超出范围时调用它。

2 个答案:

答案 0 :(得分:3)

不,不会。在您的示例中,存储与foo完全相关。当foo超出范围时,析构函数将被调用。

当然,如果您仍然有对该对象的引用,那么引用将引用一个现在不存在的对象,这可能会给您带来问题。

引用不会模拟原始对象。它所做的就是说,当该对象存在时,通过引用的任何调用都将被重定向到该对象。

答案 1 :(得分:1)

对象的引用和(原始)指针不管理它的生命周期。因此,当任何一个超出范围时,真实对象将不会被销毁。否则,您无法创建对stackallocated对象的引用或指针,因为它们会被多次销毁(当引用/指针超出范围时以及对象本身超出范围时)。在我看来,理解c ++引用的最简单方法是将它们视为无法重新分配的指针,并且每次访问都会自动取消引用(基本上是语法糖来隐藏程序员的指针)。

作为旁注,你的代码不正确c ++。 MyCLass foo = new MyClass()声明类型为MyClass的(stackallocated)对象,但尝试将new MyClass()的结果分配给它,它是指向类型为MyClass的堆分配对象的指针。初始化foo的正确方法是MyClass foo;