Я хочу определить свое собственное место размещения и удаление места размещения (принимая дополнительные параметры), и я обнаружил, что могу правильно вызвать место размещения, но не могу получить доступ к удалению места размещения. Может ли кто-нибудь сказать мне, правильно ли я определяю удаление места размещения или я вызываю его неправильно?
class A
{
public:
A( int a ) : a(a){}
static void* operator new( std::size_t, int ); // the placement new
static void operator delete( void*, int )throw(); // the corresponding placement delete
private:
int a;
};
void* A::operator new( std::size_t size, int n )
{
std::cout << "size: " << size << " " << "n: " << n << std::endl;
return ::operator new(size);
}
void A::operator delete( void* p, int n )throw()
{
std::cout << "n: " << n << std::endl;
::operator delete(p);
}
int main( int argc, char* argv[] )
{
A* a = new(10) A(100);
std::cout << std::endl;
delete(4) a; // error???????????????????, but how?
return 0;
}
размещение delete
доступно только для обработки исключений, возникающих при оценке места размещения new
выражение. Если строительство завершится успешно, то позже нормально delete
будет использоваться.
Вы можете явно вызвать функцию освобождения места размещения, но она не будет работать так же, как delete
оператор (он не вызовет деструктор автоматически).
В вашем случае соответствующий код будет:
a->~A();
A::operator delete(a, 4);
Тьфу!
Для массивов это еще хуже, потому что вы не можете получить количество элементов (и количество вызываемых деструкторов) из того места, где компилятор сохранил их для собственного использования.
Создай свой перегруженный operator new
так что он правильно соединяется с одним аргументом operator delete
, Тогда пользователи вашего класса могут использовать delete ptr;
а также std::unique_ptr
и т.п.
Если вам требуется пользовательское освобождение, то оболочка выделения, которая возвращает std::shared_ptr
с пользовательским удалителем будет лучше, чем пользовательское размещение нового.
Других решений пока нет …