#pragma once
using namespace std;
#include <memory>
template <typename E>
class Link
{
private:
static unique_ptr<Link<E>> freelist; // Pointer to the freelist head
// How to release the memory if I use Link<E>*
public:
E element;
Link *next;
Link(const E &eleval, Link *nextval = nullptr)
: element(eleval)
, next(nextval) {}
Link(Link *nextval = nullptr) : next(nextval) {}
void *operator new(size_t)
{
if (freelist == nullptr) return ::new Link;
unique_ptr<Link<E>> temp = freelist;
freelist = freelist->next;
return temp.get();
}
void operator delete(void* ptr)
{
((Link<E>*)ptr)->next = freelist.get();
freelist = make_unique<Link<E>>(ptr);
}
};
template <typename E>
unique_ptr<Link<E>> Link<E>::freelist = nullptr;
Ранее я использовал Link * для хранения адреса freelist, но потом обнаружил, что не могу освободить память freelist.Поэтому я решил использовать unique_ptr для его сохранения, поскольку память будет автоматически освобождена.
Однако я попал в эту проблему:
void operator delete(void* ptr)
{
((Link<E>*)ptr)->next = freelist.get();
freelist = *reinterpret_cast<unique_ptr<Link<E>>*>(ptr);
}
В этой функции я пытался преобразовать void *to unique_ptr и наоборот, но я получил эту ошибку при компиляции кода:
Ошибка C2679 бинарная '=': не найден оператор, который принимает правый операнд типа 'Link *' (или нет приемлемого преобразования)
Есть ли другой способ, кроме этого, преобразовать необработанный указатель в умный указатель?