Как выполнить некоторый код в деструкторе * после * уничтожения члена - PullRequest
0 голосов
/ 23 мая 2018

У меня есть класс "manager", который должен выполнить определенную очистку после , члены уничтожены:

class Manager
{
    Member a, b;

    ~Manager()
    {
        // this code will be executed BEFORE the a and b destructors
        important_cleanup();
    }
};

Проблема в том, что important_cleanup() делает недействительными мои переменныеa и b, поэтому их деструкторы терпят неудачу.

Есть ли хороший способ обойти проблему?

PS Я знаю, что могу определить какую-то подсказкучлен, и сделать его первым созданным членом Manager, но это выглядит довольно уродливо и делает вещи зависимыми от порядка ...

1 Ответ

0 голосов
/ 23 мая 2018

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

Тем не менее, если вам неудобно полагаться на него, деструкторы членов вызываются раньше, чем у базовых классов, так что вы можете использовать базовый класс для этого:

class ManagerCleanup {
public:
    ~ManagerCleanup() {
        important_cleanup();
    }

private:
    some_native_resource resource;
};

// Might as well inherit privately
class Manager : private ManagerCleanup
{
    Member a, b;
};

Обратите внимание, что это более идиоматично, если вы оберните ресурс:

// Note: this could probably be a std::unique_ptr. std::unique_ptr can
// manage arbitrary resources, not just pointers.
class ItemRequiringCleanup {
public:
    // Ensure you implement/disable copy/move operations appropriately

    ~ItemRequiringCleanup() {
        important_cleanup();
    }

private:
    some_native_resource resource;
};

class ManagerCleanup {
private: // or protected:
    ItemRequiringCleanup resource;
};

// Might as well inherit privately
class Manager : private ManagerCleanup
{
    Member a, b;
};
...