как использовать my_alloc для _все_ новых вызовов в C ++? - PullRequest
0 голосов
/ 21 января 2010

Представьте, что я на C-земле, и у меня есть

 void* my_alloc(size_t size);
 void* my_free(void*);

тогда я могу просмотреть свой код и заменить все вызовы malloc / free на my_alloc / my_free.

Как, я знаю, что учитывая класс Foo, я могу сделать размещение новым; Я также могу перегрузить нового оператора. Однако, есть ли способ сделать это для всех моих классов C ++? (т.е. я хочу использовать свой собственный распределитель для новых и новых []; но я не хочу пробираться и взламывать каждый класс, который я определил.)

Спасибо!

Ответы [ 3 ]

7 голосов
/ 21 января 2010

В глобальном масштабе,

 void* operator new(size_t s) { return my_alloc(s); }
 void operator delete(void* p) { my_free(p); }
 void* operator new[](size_t s) { return my_alloc(s); }
 void operator delete[](void* p) { my_free(p); }
2 голосов
/ 21 января 2010

Определение пользовательских глобальных новых и удаление функций оператора:

void* operator new(size_t size) 
{
    //do something
    return malloc(size);
}

void operator delete(void *p) 
{
    //do something     
     free(p); 
}

Placement new можно использовать, когда вы хотите создать объект из заранее выделенного буфера.

Частое использование новых и удаленных файлов приведет к фрагментации памяти и затратам на доступ к памяти и ее выделение. Таким образом, вся идея размещения нового состоит в том, чтобы создать пул памяти при запуске программы и уничтожить его в конце программы, а все запросы на память просто возвращает свободное место в памяти из пула.

0 голосов
/ 14 мая 2016

Вот что я нашел. это может помочь.

template<typename T>
T* my_alloc(size_t size)
{
    return new T[size];
}

template<typename T>
void my_free(T* ptr)
{
    delete[] ptr;
}

А вот пример, используемый:

int main(void)
{
    char* pChar = my_alloc<char>(10);
    my_free(pChar);
}

Альтернативный пример:

void* my_alloc (size_t size)
{
   return ::operator new(size);
}

void my_free (void* ptr)
{
   ::operator delete(ptr);
}

Весь этот код должен быть проверен.

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