【问题标题】:Unique ptr with custom allocator and deleter带有自定义分配器资金删除器的 Unique_ptr
【发布时间】:2019-01-16 09:32:26
【问题描述】:

我正在尝试在以下场景中使用唯一的 ptr:

MyClass *pMC = NULL;
if ( !MyCustomAlloc(void ** (&pMC), sizeof(MyClass) )
{
    return false;
}
// do things
if (something else fails)
{
    MyCustomDelete(pMC);
    return false;
}

现在,我要做的是将其转换为唯一的 ptr,以便不需要显式调用 MyCustomDelete。

我不明白如何保留上述结构并仍然返回适当的值。

unique_ptr<MyClass, void (*)(void**, size_t)> pMC( <b>Not Sure What Goes Here</b> , MyCustomDelete);
  • 如果我将 MyCustomAlloc 作为第一个参数,如何检测到它的失败?
  • 或者如果我执行以下操作,那么 pMC 将被初始化为 NULL,但是如何设置自定义删除器? unique_ptr&lt;MyClass, void (*)(void**, size_t)&gt; pMC;

    我可以做类似pMC.set(MyCustomDelter) 的事情吗?

【问题讨论】:

  • MyCustomAlloc(void ** (&amp;pMC), sizeof(MyClass) 导致标准 C++ 中的未定义行为(您不能将其他指针别名为 void *)。最好将函数设为template&lt;typename T&gt; T *MyCustomAlloc();或类似
  • 你试过here的建议了吗?
  • 谢谢。试一试。将报告进展情况。

标签: c++11 unique-ptr


【解决方案1】:

解决方案是创建一个重载 () 运算符的删除类,然后将该类作为第二个模板参数传递。

typedef struct MyClassDeleter { void operator()(MyClass* p) { MyCustomDelete(p); } } std::unique_ptr<MyClass, MyClassDeleter> pMC;

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 2015-08-13
    • 1970-01-01
    • 2016-11-23
    • 2015-08-15
    • 2013-03-30
    • 1970-01-01
    • 2015-09-11
    • 2012-04-11
    相关资源
    最近更新 更多