Будут ли члены профсоюза называть своих деструкторов в этом сценарии? - PullRequest
0 голосов
/ 04 ноября 2019

Будет ли класс с пустым dtor вызывать dtors своего члена, когда его собственный явно вызывается из объединения?

Это довольно сложно, надеюсь, псевдо-код более понятен. В этом примере будет Texture::~Texture() вызывать source.bitmap.pixels.~vector() неявно?

struct Bitmap{
    ~Bitmap(){} // empty dtor

    // members
    std::vector<uint8> pixels;  // <-- will this dealloc when ~Bitmap() is called manually?
};

struct Texture{
    ~Texture(){
        // assume sourceType is 1
        switch(sourceType){ 
        case 1:
            source.bitmap.~Bitmap();
            break;
        }
    }

    // members
    uint sourceType;
    union Source{
        Source(){}
        ~Source(){}

        // members
        Bitmap bitmap;
    }source;
};

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Да, он будет неявно вызывать деструкторы всех членов, и если ваш класс был производным от другого класса, он также будет вызывать деструктор базового класса.

1 голос
/ 04 ноября 2019

Выполнение деструктора определено для выполнения тела функции деструктора, а затем также для выполнения вызовов деструкторов членов и баз. Вызов псевдодеструктора выполняет деструктор.

Так что да, вызов псевдо-деструктора в этом случае корректно уничтожит pixels.

...