Официальная документация частенько удивляет! На этот раз мы нашли полезный рецепт в changelog к старой (на данный момент) версии компилятора.
Шаблон moveToHeap принимает некий объект, извлекает указатель на него, производит выделение памяти с помощью GC.malloc и moveEmplace (который лежит в std.algorithm) осуществляет перемещение данных из одного участка памяти в другой. С помощью взятия и распечатки указателей на объект до и после перемещения убеждаемся, что указывают они на разные участки памяти (указатель – это адрес, распечатав адреса видим что они разные).
Таким образом отпадает необходимость инициализировать и уничтожать значение перед переходом в неинициализированные данные.
import std.stdio;
import std.algorithm;
class Example
{
this(){}
}
T* moveToHeap(T)(ref T value)
{
import core.memory : GC;
auto ptr = cast(T*)GC.malloc(T.sizeof);
// move value and emplace it into ptr
moveEmplace(value, *ptr);
return ptr;
}
void main()
{
auto c = new Example;
auto p = moveToHeap(c);
writefln("%0.16x",&c);
writefln("%0.16x", p);
}