Вы можете выполнить глобальную перегрузку оператора new
и заставить его извлечь необработанную память из calloc()
. Таким образом, память очищается перед запуском конструкторов, поэтому проблем нет.
Любой класс, который переопределяет новый самостоятельно, не получит ваш специальный new
на основе *1006*, но тогда этот класс должен все равно правильно инициализироваться.
Не забудьте переопределить new
и delete
и версии массива ...
Что-то вроде:
#include <exception> // for std::bad_alloc
#include <new>
#include <stdlib.h> // for calloc() and free()
void* operator new (size_t size)
{
void *p=calloc(size, 1);
if (p==0) // did allocation succeed?
throw std::bad_alloc();
return p;
}
void operator delete (void *p)
{
free(p);
}
void* operator new[] (size_t size)
{
void *p=calloc(size, 1);
if (p==0) // did allocation succeed?
throw std::bad_alloc();
return p;
}
void operator delete[] (void *p)
{
free(p);
}
Обратите внимание, что эти простые версии не совсем такие, какими они должны быть - оператор new
должен запускаться в цикле, вызывая new_handler
(если он установлен) и выбрасывать исключение bad_alloc
только при наличии нет new_handler
. Или что-то в этом роде, мне придется поискать его и обновить позже.
О, и вы также можете переопределить версию no_throw
.