Я хочу переопределить новый оператор в 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);
благодаря
Все, что вам нужно, это синтаксис места размещения, который будет определен для пользовательского распределения. Подобно:
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);
Вы можете передать параметры в функцию распределения (т.е. operator new
) в новом выражении следующим образом:
new (b) CMyClass // passes "b" to "bUseWhichManager"
предполагая, что у вас было следующее объявление operator new
как члена CMyClass
, как в вашем вопросе:
void* operator new(size_t size, BOOL bUseWhichManager);
(Не ставьте параметр в конструктор, поскольку это не имеет смысла, вероятно.)
Использование оператора размещения
#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);
CMemManager1::operator delete(p1,manager1)
еслиoperator delete
определен как функция-член?