繁体   English   中英

unique_ptr 没有操作删除

[英]No op delete for unique_ptr

将 unique_ptr 传递给不执行任何操作的自定义删除器的最简洁方法是什么? 我需要一个我正在编写的 JNI 函数,其中 C++ 端需要一个 unique_ptr,但是,我不希望在退出 JNI 函数时删除 unique_ptr 持有的对象 - 我稍后会处理删除。 所以我想做类似的事情:

std::unique_ptr<MyClass, noop_delete> ptr;

在一行中 - 没有单独的函数定义:-)

正如@ 101010指出的那样, std::unique_ptr带有nop删除器是非常奇怪的,因为std::unique_ptr唯一有价值的东西实际上就是删除器。 另外,你说“C ++方面需要一个unique_ptr”,但是带有不同删除器的std::unique_ptr将是一个不同的类型 ,这可能不起作用。

不过,这是做到这一点的方法:

struct nop
{
    template <typename T>
    void operator() (T const &) const noexcept { }
};

template <typename T>
using nop_unique_ptr = std::unique_ptr<T, nop>;

请注意,此nop类型可以在任何地方用作无操作,而不是单参数仿函数。

我在答案中对@ lisyarus的问题的回答促使我提出了一个比我给那里更好的解决方案。 这本书以已经@lisyarus陈述的事实:无操作删除器unique_ptr是不同类型比的unique_ptr具有delete删除器。

我将此作为单独的答案发布,因为它可能与其他人相关(此外,这不适合单个评论)。

上下文 :对于单元测试,FakeIt模拟框架管理模拟对象的生命周期,因此当需要模拟通过unique_ptr指向的对象时,我们需要带有no-op删除器的unique_ptr。

// As in @lisyarus's answer...
struct nop
{
    template <typename T>
    void operator() (T const &) const noexcept { }
};

// NOTE: We have no use for a pointer that doesn't delete unless we're mocking, so 
// the types below are named to indicate that.

#ifndef WE_ARE_BUILDING_UNIT_TESTS
// Production build - we want a unique_ptr that deletes.
template <typename T>
using mockable_unique_ptr = std::unique_ptr<T>;
#else
// Unit test build - we want unique_ptr that doesn't delete.
template <typename T>
using mockable_unique_ptr = std::unique_ptr<T, nop>;
#endif

现在,mockable_unique_ptr将根据构建类型自动切换类型,这意味着您不必在代码上遍布#ifdefs。 当然,你需要某些位置#ifdef /#else,并使用稍微不同的代码进行单元测试构建(可能在指针初始化的站点,但如果你的mock也在那里创建,你需要反正这样做)。 然而,其余代码保持不变,因为unique_ptr的接口不会改变。

std::unique_ptr::release怎么样?

void JNIfunc (T*) {};
std::make_unique( new T) t;
JNIfunc( t.release);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM