Могу ли я конвертировать void * в unique_ptr? - PullRequest
0 голосов
/ 08 октября 2018
#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 *' (или нет приемлемого преобразования)

Есть ли другой способ, кроме этого, преобразовать необработанный указатель в умный указатель?

...