Прежде всего, важно отметить, что new
и delete
могут быть перегружены либо глобально, либо только для одного класса. Оба случая показаны в этой статье . Также важно отметить, что если вы перегрузите new
, вы почти наверняка захотите перегрузить delete
.
Есть несколько важных замечаний о operator new
и operator delete
:
- Стандарт C ++ требует, чтобы верный указатель возвращался, даже если переданный ему размер равен 0.
- Есть также
operator new[]
и operator delete[]
, так что не забывайте перегрузить их.
- Производные классы наследуют
operator new
и его братьев, поэтому обязательно переопределите их.
В Действующий C ++ , пункт 8, Скотт Мейерс включает несколько псевдокодовых примеров:
void * operator new(size_t size) // your operator new might
{ // take additional params
if (size == 0) { // handle 0-byte requests
size = 1; // by treating them as
} // 1-byte requests
while (1) {
attempt to allocate size bytes;
if (the allocation was successful)
return (a pointer to the memory);
// allocation was unsuccessful; find out what the
// current error-handling function is (see Item 7)
new_handler globalHandler = set_new_handler(0);
set_new_handler(globalHandler);
if (globalHandler) (*globalHandler)();
else throw std::bad_alloc();
}
}
void operator delete(void *rawMemory)
{
if (rawMemory == 0) return; // do nothing if the null
// pointer is being deleted
deallocate the memory pointed to by rawMemory;
return;
}
Для получения дополнительной информации я бы определенно взял Эффективный C ++ .