контекст
Для целей тестирования мне нужно построить объект на ненулевой памяти. Это можно сделать с помощью:
{
struct Type { /* IRL not empty */};
std::array<unsigned char, sizeof(Type)> non_zero_memory;
non_zero_memory.fill(0xC5);
auto const& t = *new(non_zero_memory.data()) Type;
// t refers to a valid Type whose initialization has completed.
t.~Type();
}
Поскольку это утомительно и выполняется несколько раз, я хотел бы предоставить функцию, возвращающую умный указатель на такой экземпляр Type
. Я придумал следующее, но я боюсь, что где-то скрывается неопределенное поведение.
Вопрос
Хорошо ли определена следующая программа? В частности, является ли тот факт, что std::byte[]
был выделен, но Type
эквивалентного размера освобождается проблема?
#include <cstddef>
#include <memory>
#include <algorithm>
auto non_zero_memory(std::size_t size)
{
constexpr std::byte non_zero = static_cast<std::byte>(0xC5);
auto memory = std::make_unique<std::byte[]>(size);
std::fill(memory.get(), memory.get()+size, non_zero);
return memory;
}
template <class T>
auto on_non_zero_memory()
{
auto memory = non_zero_memory(sizeof(T));
return std::shared_ptr<T>(new (memory.release()) T());
}
int main()
{
struct Type { unsigned value = 0; ~Type() {} }; // could be something else
auto t = on_non_zero_memory<Type>();
return t->value;
}