Я думаю, что этот вопрос может быть дубликат, но я не знаю, как его искать.Может ли оператор new() инициализировать POD перед запуском конструктора?
Я пытаюсь перегрузить operator new
, чтобы я мог разрешить буфер переменной длины после моего класса. Мой текущий проект работает по назначению, или это неопределенное поведение?
Если ответ отличается в C++ 98, C++ 03 и C++ 11, пожалуйста, объясните различия.
struct POD { /* ...other POD members here... */ };
struct BufferedPOD : POD
{
size_t n;
BufferedPOD()
// Assume n is already initialized...
{
}
static void *operator new(size_t size)
{
return ::operator new(size);
}
static void *operator new(size_t size, size_t additional_size)
{
void *const p = operator new(size + additional_size);
static_cast<BufferedPOD *>(p)->n = additional_size;
return p;
}
static void operator delete(void *p)
{
return ::operator delete(p);
}
static void operator delete(void *p, size_t)
{
return operator delete(p);
}
};
int main()
{
std::auto_ptr<BufferedPOD> p(new (1000) BufferedPOD());
foo(p.get()); // do something with buffer
return 0;
}
Почему вы перемещаете тот оператор нового/удалить за пределами класса особой причиной – Mehrdad
Во-первых, повторное использование. Во-вторых, разрешая удаление с помощью базового указателя, если вы добавляете виртуальный dtor там один раз. В-третьих, избегая кодирования других вариантов. – Deduplicator
Я вижу. +1. Я все еще перевариваю этот ответ, так как я мог бы поклясться, что раньше я пытался идти в аналогичном направлении и ударил камень преткновения, но я не могу понять, что это сейчас ... тем временем, где нарушение правила из 3, о котором вы говорите? – Mehrdad