Примечание. Ответ от @ gimme_danger относится к старой версии вопроса.Вот ответ для новой версии .
T* ptr = (T*)malloc(sizeof(T)*length);
array = std::shared_ptr<T>(
new(ptr) T[length],
[](T* ptr){ /*...*/ }
);
Сначала вы выделяете часть памяти, используя malloc
, затемиспользуйте синтаксис размещения-нового для вызова конструктора T
.Вы должны сделать и то, и другое в устройстве удаления.
[](T* ptr) {
std::destroy_n(ptr, length);
std::free(ptr);
}
Вам не нужен деструктор.Деструктор shared_ptr
уничтожается автоматически.Кстати, ваш класс имеет семантику указателей, то есть два экземпляра могут совместно использовать одну и ту же память, что, вероятно, нежелательно.