Удаление оператора после нового оператора и нового размещения?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Удаление оператора после нового оператора и нового размещения?

Сообщение Anonymous »

Предположим, я хочу поместить объект в «кучу», но после него мне нужно выделить дополнительную память.
Насколько я понимаю, следующее будет стандартным: совместимый способ сделать это:
(Предположим на данный момент, что ничто не переопределяет new, и деструктор SomeClass не выдает исключение)

Код: Выделить всё

#include 

void f(std::size_t n) {
void* buf = ::operator new(sizeof(SomeClass) + n);
SomeClass* obj = new(buf) SomeClass;

// Do stuff with obj

obj->~SomeClass();
::operator delete(buf);
}
Но допустим, я не хочу постоянно сохранять переменную buf. Возможно, я создаю объект в одной функции, а потом уничтожаю его в какой-то другой функции, и мне неудобно продолжать передавать buf вместе с obj. Было бы правильно сделать что-то вроде этого:

Код: Выделить всё

#include 

void f(std::size_t n) {
void* buf = ::operator new(sizeof(SomeClass) + n);
SomeClass* obj = new(buf) SomeClass;

// Do stuff with obj

obj->~SomeClass();
::operator delete(static_cast(obj));
}
Мне не удалось окончательно выяснить из ссылки, считается ли указатель, возвращаемый размещением new, если он преобразован в void*, «тот же самый» указатель, возвращаемый оператор new.
Наконец, есть ли шанс, что что-то вроде этого допустимо:

Код: Выделить всё

#include 

void f(std::size_t n) {
void* buf = ::operator new(sizeof(SomeClass) + n);
SomeClass* obj = new(buf) SomeClass;

// Do stuff with obj

delete obj;
}
Я предполагаю, что это неверно, но технически obj был возвращен новым выражением и находится в памяти, выделенной оператором new, так может быть?
EDIT: Мне только что пришло в голову, не мог бы другой способ сделать это, добавив переопределение для оператора new, а затем используя его в новом месте размещения? Другими словами, допустимо ли что-то вроде этого:

Код: Выделить всё

#include 

enum class ExtraSpace : std::size_t {};

void* operator new(std::size_t size, ExtraSpace n) {
return ::operator new(size + static_cast(n));
}

void f(std::size_t n) {
SomeClass* obj = new(ExtraSpace(n)) SomeClass;

// Do stuff with obj

delete obj;
}
(Я работаю с C++14, но мне также было бы интересно узнать о различиях в других стандартах)

Подробнее здесь: https://stackoverflow.com/questions/782 ... cement-new
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»