Некоторые люди выступают за размещение новых.
Это опасно, и пока в двух примерах использования пропущены важные детали, такие как заголовок <new>
, квалификация вызова как ::new ...
и способ очисткиup.
Безопасное решение - определить пользовательские функции выделения и освобождения для вашего класса или для класса, производного от вашего класса.Пример ниже показывает последнее.Обратите внимание, что виртуальный деструктор существует только для поддержки деривации классов;если вы не выводите, вам это не нужно.
#include <stddef.h>
#include <iostream>
void* some_allocator_im_forced_to_use( size_t size )
{
std::cout << "Allocated " << size << " bytes." << std::endl;
return ::operator new( size );
}
void some_deallocator_im_forced_to_use( void* p, size_t size )
{
std::cout << "Deallocated " << size << " bytes." << std::endl;
::operator delete( p );
}
struct A
{
int x_;
A(): x_( 42 ) {}
virtual ~A() {}
};
struct CustomAllocedA
: A
{
void* operator new( size_t size )
{
return some_allocator_im_forced_to_use( size );
}
void operator delete( void* p, size_t size )
{
some_deallocator_im_forced_to_use( p, size );
}
};
int main()
{
A* const p = new CustomAllocedA;
std::cout << p->x_ << std::endl;
delete p;
}
Важно: хотя это само по себе «безопасно», и хотя этот конкретный пример безопасен, безопасность для вашего *Код 1011 * в конечном итоге опирается на ваш пользовательский распределитель, возвращающий указатель на правильно выровненную память.
Приветствия & hth.,