Lite_stream
@Lite_stream

Как правильно выделять сырую память для размещения в ней объектов?

Есть ли способ инициализировать "сырую" статическую память под объекты не вызывая их конструкторы?

Пример кода:
template<typename T, size_t capacity>
class Container
{

private:

    alignas(alignof(T)) uint8_t buffer[sizeof(T) * capacity];
    size_t size = 0;

public:

    ~Container()
    {
        for (size_t i = 0; i < size; ++i)
        {
            (reinterpret_cast<T *>(&buffer[sizeof(T) * i]))->~T();
        }
    }

    void add(const T & element)
    {
        new (&buffer[sizeof(T) * size]) T(element);
        ++size;
    }

    const T & get(size_t i)
    {
        return *(reinterpret_cast<T *>(&buffer[sizeof(T) * i]));
    }

};


Вот такой обходной путь пришёл в голову. Но, если честно, смущают reinterpret cast'ы :), хотелось бы без них, через обычный T buffer[capacity], но без вызова конструкторов.
  • Вопрос задан
  • 163 просмотра
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Нет, если вы не вызвали конструктор и обратились к объекту, вы схлопочете UB, формально говоря.
Да и какой смысл в том, чтобы навыделять памяти, а конструкторы не вызывать? Это нарушает принцип RAII как минимум.
Кстати, именно статической памяти я в вашем коде не увидел.

Так что со стороны это все выглядит как проблема X-Y.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы