我可以将void *转换为unique_ptr吗?

时间:2018-10-08 15:25:08

标签: c++ oop pointers type-conversion smart-pointers

#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二进制'=':未找到右手运算符   “链接*”类型的操作数(或没有可接受的转换)

除了此以外,还有其他方法可以将原始指针转换为智能指针吗?

0 个答案:

没有答案