Ошибка компилятора при переопределении оператора new - PullRequest
2 голосов
/ 01 января 2012

Я не понимаю, почему я получаю ошибки компилятора при попытке скомпилировать это:

void* MemoryManagedObject::operator new(size_t size, bool UseMemPool)
{
    Engine* engine = Engine::GetEngine();
    void* alloc;

    alloc = engine->GetMemoryManager()->Allocate(size, UseMemPool);

    if (alloc && UseMemPool)
        mAllocatedWithMemPool = true;

    return alloc;
}

В нем говорится «недопустимое использование члена MemoryManagedObject :: mAllocatedWithMemPool в статической функции-члене».

По сути, у меня есть флаг, который указывает, использовал ли я свой пул памяти или просто malloc () при выделении экземпляра класса, и я хочу установить его, когда переопределяю 'new'.

Я предполагаю, что 'новый метод должен вернуть, прежде чем вы можете использовать экземпляр класса?Есть ли способ обойти это?

РЕДАКТИРОВАТЬ: Просто любопытно, ss этот код также является правильным решением?

void* MemoryManagedObject::operator new(size_t size, bool UseMemPool)
{
    Engine* engine = Engine::GetEngine();
    MemoryManagedObject* alloc;

    alloc = (MemoryManagedObject*)engine->GetMemoryManager()->Allocate(size, UseMemPool);

    if (alloc && UseMemPool)
        alloc->mAllocatedWithMemPool = true;

    return alloc;
}

Ответы [ 2 ]

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

Каждая перегрузка для operator new()operator delete()) неявно и автоматически объявляется static.Это специальное правило в C ++.

Поэтому вы должны спроектировать свой класс так, чтобы конструктор также мог помнить, как он был распределен, если вам нужно сохранить эту информацию:

Foo * p = new (true) Foo(true);

То есть ваш класс будет выглядеть следующим образом:

class Foo
{
    bool mAllocatedWithMemPool;
public:
    static void * operator new(std::size_t n, bool usePool);
    static void operator delete(bool) throw();
    explicit Foo(bool usePool);
    /* ... */
};

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

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

Эта ошибка в основном говорит о том, что вы не можете использовать член вашего класса в статическом методе.
Переменная-член связана с экземпляром, который ее содержит (ваш указатель this). Статический метод не связан с экземпляром вашего класса (что делает его «статическим». Он принадлежит всем экземплярам вашего класса.)
Когда вы пытаетесь использовать переменную-член в статическом методе, компилятор не может знать, к какому экземпляру вашего класса принадлежит эта переменная-член, поскольку метод принадлежит всем им.

...