Передайте больше параметров в переопределении нового оператора (C ++)

0

Я хочу переопределить новый оператор в C++, следуя инструкциям на http://www.cprogramming.com/tutorial/operator_new.html

    class CMyclass
    {
    public:
           CMyClass(BOOL bUseWhichMemManager);
            void* operator new(size_t);
            void operator delete(void*);
    };

Я создаю два менеджера памяти под названием CMemManager1 и CMemMangaer2, используя разные алгоритмы для выделения буфера. Теперь я хочу контролировать, какой менеджер памяти будет использоваться при вызове new.

Я пытаюсь добавить в конструктор параметр bUseWhichMemManager, но при переопределении новой функции невозможно получить доступ к параметру. Есть ли способ передать больше параметров новому оператору, например:

    void* operator new(size_t size, BOOL bUseWhichManager);

благодаря

Теги:
operator-keyword
override

3 ответа

1

Все, что вам нужно, это синтаксис места размещения, который будет определен для пользовательского распределения. Подобно:

void *
operator new (std::size_t size, CMemManager1& manager)
{
    return manger.allocate(size) ;
}

void
operator delete (void * p, CMemManager1& manager)
{
   manager.deallocate(p) ;
}

void *
operator new (std::size_t size, CMemManager2& manager)
{
    return manger.allocate(size) ;
}

void
operator delete (void * p, CMemManager2& manager)
{
   manager.deallocate(p) ;
}

а потом

CMemManager1 manager1;
CMemManager2 manager2;

CMyclass * p1 = new (manager1) CMyclass ;
CMyclass * p2 = new (manager2) CMyclass ;

// It is a placement syntax so you should call your destructor manually.
p1->~CMyclass();
p2->~CMyclass();

operator delete(p1, manager1);
operator delete(p2, manager2);
  • 0
    Нужен ли нам CMemManager1::operator delete(p1,manager1) если operator delete определен как функция-член?
1

Вы можете передать параметры в функцию распределения (т.е. operator new) в новом выражении следующим образом:

new (b) CMyClass // passes "b" to "bUseWhichManager"

предполагая, что у вас было следующее объявление operator new как члена CMyClass, как в вашем вопросе:

void* operator new(size_t size, BOOL bUseWhichManager);

(Не ставьте параметр в конструктор, поскольку это не имеет смысла, вероятно.)

0

Использование оператора размещения

#include<new>
#include<memory>
class A {
    // Some stuff
};

A* a = (A*) _mm_malloc(sizeof(A),16);
// Now call the ctor without allocation
new a A(/* some arguments */);

// Delete
_mm_free(a);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню