C ++ - умный указатель и дилемма распределения памяти - PullRequest
1 голос
/ 06 марта 2012

У меня возникла дилемма, касающаяся интеллектуальных указателей и распределения памяти.

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

template <class T>
    class Object
    {
    public:
        inline Object()
        {
            Init();

            if (mEngine)
            {
                mObj = (T*) mEngine->GetMemoryManager()->Allocate(sizeof(T));
                mRefCount = 1;
            }
        }

Теперь, когда я хочу Destroy() мой движок, я хочу также освободить всю память. Это в первую очередь потому, что я хочу очистить всю память, связанную с моим движком, а также потому, что очистка mObj зависит от моего менеджера памяти, поскольку он может использовать, например, пул памяти для выделения / освобождения памяти и удаления этого менеджера памяти приведет к нераспределенной памяти.

Значит, я выстрелил себе в ногу умными указателями? Есть ли умный способ решить эту проблему?

1 Ответ

6 голосов
/ 06 марта 2012

Почему так? Фактически, это обычная практика, когда умный указатель смешивается с настраиваемым управлением памятью. std::shared_ptr (или boost::shared_ptr) поддерживает пользовательское средство удаления, указатель с подсчетом ссылок обычно имеет некоторый виртуальный метод, который вызывается для их освобождения и т. Д.

Вы не можете, однако, уничтожить двигатель, пока что-то еще использует его части, такие как те объекты, на которые ссылаются. Для этого люди обычно делают указатель подсчета ссылок «движком» тоже. Просто будьте осторожны с циклическими зависимостями.

... и да пребудет с тобой сила!

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