使用unique_ptr包装和解开void*

问题描述 投票:0回答:3

std::unique_ptr<void*>
是指向指针的唯一pointer。指向对象的指针与尖头对象分开。换句话说,指针和尖的对象具有不同的地址。指针到空隙的值是指向对象的地址,而指向指向void的指针的值是指向对象的指针的地址。
c++ c++11 c++14 c++17
3个回答
1
投票
p.get()

为您提供(即指向指向)唯一指针拥有的对象的地址。为了使指针从(唯一)指针指向Void的指针,您必须通过(唯一的)指针向Void指针进行间接。这给出了等于

void*
s1的地址:

v


P.S。您永远不会删除动态分配的
std::cout << *p;
,因此您的内存泄漏。
    

State1
是指向指针的明智指针。
您希望
std::unique_ptr<void*>

作为第一步。

您需要的下一件事就是达到独特的PTR如何删除资源;默认情况下,唯一的PTR只是调用DELETE,这在无效指针上无法使用。  它无法知道存储在空隙指针中的类型,因此无法调用destructor。
unique_ptr<void>


1
投票
template<class T> std::unique_ptr<void, void(*)(void*)> wrap_ptr(T* ptr){ return {ptr, [](void*ptr){ delete static_cast<T*>(ptr); }}; }

我怀疑代码可以做您想要的。
除了一个旁边,cost is掩盖了一个错误消息,说明您做错了什么。避免使用C样式。
您正在重新诠释

auto p = wrap_ptr(s1);

((void*)p.get())
应该是一个危险信号。

Adam Nevraumont指出,

void**
不起作用。
如果您使用的是

void*

,则可能是您最好的选择。
这将用
std::unique_ptr<void*>

代替

c++17

。请记住,如果没有很多额外的工作,就不会编译。 最佳选项是:


使用原始指针

std::any


使用
std::unique<void>

用于智能指针支持 +类型安全

0
投票

std::unique<std::any>>

https://cengizhanvarli.medium.com/what-is-std-any-in-c-76f2575ad37b

https://en.cppreference.com/w/cpp/utility/any


std::unique_ptr<void>

相关的问题

    当我应该使用std ::noy
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.