как использовать my_alloc для _all_ новых вызовов в С++?

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

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

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

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

Спасибо!


person anon    schedule 21.01.2010    source источник
comment
C++ позволяет вам предоставлять свои собственные реализации глобального создания и удаления.   -  person    schedule 21.01.2010
comment
my_free не должен возвращать void*. Просто говорю.   -  person Chris Lutz    schedule 22.01.2010


Ответы (3)


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

 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); }
person kennytm    schedule 21.01.2010
comment
на самом деле, есть 12 функций для замены: new/delete, new/delete nothrow, размещение new/delete - и каждая с версией массива. См. здесь: gamedev.net/community/forums/viewreply.asp?ID =2471345 - person Tobias Langner; 21.01.2010
comment
@Tobias Хороший вопрос о версиях nothrow, но операторы размещения не нуждаются в замене. - person James Hopkin; 21.01.2010
comment
Примечание: этот подход заменит new/delete только в вашем собственном коде. вызовы new/delete в статически связанных зависимостях не будут изменены. - person Mahmoud Al-Qudsi; 21.01.2010
comment
@James: Могу я спросить, почему? Кажется, я читал, что вы не должны забывать о размещении new на случай, если кто-то его использует. - person Tobias Langner; 21.01.2010
comment
@Tobias: Вы не можете заменить place-new. Подумайте о том, что делает функция, и вы поймете, почему. (Подсказка: Ничего!) - person GManNickG; 21.01.2010

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

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

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

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

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

person Ashish    schedule 21.01.2010
comment
Это замена нового оператора, а не «размещение нового»: parashift.com/c++-faq-lite/dtors.html#faq-11.10 - person James Hopkin; 21.01.2010
comment
Я знаю, что оба разные. Хорошо, я устранил путаницу и удалил слово Таким образом. - person Ashish; 21.01.2010

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

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);
}

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

person LeftBased    schedule 14.05.2016