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;
我以前使用Link*来存储freelist的地址,但后来我发现我无法释放freelist的内存。所以我决定使用unique_ptr来存储它,因为内存将自动释放 然而,我遇到了这个问题: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
#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);
}