Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以将void*转换为unique\u ptr吗? #pragma一次 使用名称空间std; #包括 模板 类链接 { 私人: 静态唯一\u ptr freelist;//指向freelist头的指针 //如果使用链接,如何释放内存* 公众: E元素; 链接*下一步; 链路(常数E和标高,链路*nextval=nullptr) :元素(垂直) ,next(nextval){} Link(Link*nextval=nullptr):下一个(nextval){} void*运算符新(大小\u t) { if(freelist==nullptr)return::newlink; unique_ptr temp=自由列表; 自由列表=自由列表->下一步; 返回temp.get(); } void操作符删除(void*ptr) { ((Link*)ptr)->next=freelist.get(); 自由列表=使_唯一(ptr); } }; 模板 唯一的链接::freelist=nullptr;_C++_Oop_Pointers_Type Conversion_Smart Pointers - Fatal编程技术网

C++ 我可以将void*转换为unique\u ptr吗? #pragma一次 使用名称空间std; #包括 模板 类链接 { 私人: 静态唯一\u ptr freelist;//指向freelist头的指针 //如果使用链接,如何释放内存* 公众: E元素; 链接*下一步; 链路(常数E和标高,链路*nextval=nullptr) :元素(垂直) ,next(nextval){} Link(Link*nextval=nullptr):下一个(nextval){} void*运算符新(大小\u t) { if(freelist==nullptr)return::newlink; unique_ptr temp=自由列表; 自由列表=自由列表->下一步; 返回temp.get(); } void操作符删除(void*ptr) { ((Link*)ptr)->next=freelist.get(); 自由列表=使_唯一(ptr); } }; 模板 唯一的链接::freelist=nullptr;

C++ 我可以将void*转换为unique\u ptr吗? #pragma一次 使用名称空间std; #包括 模板 类链接 { 私人: 静态唯一\u ptr freelist;//指向freelist头的指针 //如果使用链接,如何释放内存* 公众: E元素; 链接*下一步; 链路(常数E和标高,链路*nextval=nullptr) :元素(垂直) ,next(nextval){} Link(Link*nextval=nullptr):下一个(nextval){} void*运算符新(大小\u t) { if(freelist==nullptr)return::newlink; unique_ptr temp=自由列表; 自由列表=自由列表->下一步; 返回temp.get(); } void操作符删除(void*ptr) { ((Link*)ptr)->next=freelist.get(); 自由列表=使_唯一(ptr); } }; 模板 唯一的链接::freelist=nullptr;,c++,oop,pointers,type-conversion,smart-pointers,C++,Oop,Pointers,Type Conversion,Smart Pointers,我以前使用Link*来存储freelist的地址,但后来我发现我无法释放freelist的内存。所以我决定使用unique_ptr来存储它,因为内存将自动释放 然而,我遇到了这个问题: #pragma once using namespace std; #include <memory> template <typename E> class Link { private: static unique_ptr<Link<E>> freeli

我以前使用Link*来存储freelist的地址,但后来我发现我无法释放freelist的内存。所以我决定使用unique_ptr来存储它,因为内存将自动释放

然而,我遇到了这个问题:

#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;
void操作符删除(void*ptr)
{
((Link*)ptr)->next=freelist.get();
自由列表=*重新解释(ptr);
}
在这个函数中,我试图将void*转换为unique_ptr,反之亦然,但在编译代码时出现了以下错误:

错误C2679二进制“=”:找不到使用右手的运算符 “Link*”类型的操作数(或没有可接受的转换)


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

您确实应该编写一个
节点
类型,并使用该句柄存储指向下一个对象的指针和数据。然后使用
节点实现
链接
。传递到
删除
的指针是否为
唯一类型?如果不是,则强制转换无效。智能“指针”不是指针。不要使用
#pragma一次
(),也不要使用命名空间std放置
在一个头文件中(我也会避免放入源文件,即使是玩具代码)。@George See
    void operator delete(void* ptr)
    {
        ((Link<E>*)ptr)->next = freelist.get();
        freelist = *reinterpret_cast<unique_ptr<Link<E>>*>(ptr);
    }