В C ++, если я ссылаюсь на объект с помощью освобождающего деструктора ~ MyClass, будет ли ссылка, выходящая из области видимости, вызывать деструктор? - PullRequest
1 голос
/ 22 января 2012

Будет ли работать следующее всегда?

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 ]

3 голосов
/ 22 января 2012

Нет, не будет. Хранилище целиком связано с foo в вашем примере. Когда foo выходит из области видимости, вызывается деструктор.

Конечно, если у вас еще есть ссылка на этот объект, ссылка будет ссылаться на уже не существующий объект, и это может вызвать проблемы.

Ссылка не эмулирует исходный объект. Все, что он делает, это говорит, что пока этот объект существует, любой вызов через ссылку будет перенаправлен на этот объект.

1 голос
/ 22 января 2012

Ссылки и (необработанные) указатели на объект не управляют его временем жизни.Поэтому, когда любой из них выйдет за рамки видимости, реальный объект не будет уничтожен.В противном случае вы не могли бы создавать ссылки или указатели на объекты, расположенные в стеке, поскольку они затем будут уничтожены несколько раз (когда ссылка / указатель выходит из области видимости и когда сам объект выходит из области видимости).По моему мнению, самый простой способ понять ссылки на c ++ - это думать о них как о указателях, которые не могут быть переназначены и автоматически разыменовываются при каждом доступе (в основном это синтаксический сахар, скрывающий указатель от программиста).

Assidenote, ваш код не является правильным C ++.MyCLass foo = new MyClass() объявляет (размещенный в стеке) объект типа MyClass, но пытается присвоить ему результат new MyClass(), который является указателем на выделенный объект кучи типа MyClass.Правильный способ инициализации foo будет MyClass foo;

...