#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 *存储空闲列表的地址,但是后来我发现无法释放空闲列表的内存。因此,我决定使用unique_ptr进行存储,因为内存将自动释放。
但是,我遇到了这个问题:
void operator delete(void* ptr)
{
((Link<E>*)ptr)->next = freelist.get();
freelist = *reinterpret_cast<unique_ptr<Link<E>>*>(ptr);
}
在此函数中,我试图将void *转换为unique_ptr,反之亦然,但是在编译代码时出现此错误:
错误C2679二进制'=':未找到右手运算符 “链接*”类型的操作数(或没有可接受的转换)
除了此以外,还有其他方法可以将原始指针转换为智能指针吗?