Официальная документация частенько удивляет! На этот раз мы нашли полезный рецепт в 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); }