对unique_ptr没有op删除

Fra*_*ank 2 c++ unique-ptr c++11

将unique_ptr传递给什么都不做的自定义删除工具最简洁的方法是什么?我需要一个我正在编写的JNI函数,其中C++端需要unique_ptr,但是,我不希望在退出JNI函数时删除unique_ptr所持有的对象 - 我稍后会处理删除.所以我想做一些像:

std::unique_ptr<MyClass, noop_delete> ptr;
Run Code Online (Sandbox Code Playgroud)

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

lis*_*rus 10

正如@ 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>;
Run Code Online (Sandbox Code Playgroud)

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

  • 当尝试管理对在整个程序持续时间内保持活动状态的全局内存映射资源的访问时,这在嵌入式设备中非常有用。在这种情况下,具有 noop 删除器的 unique_ptr 具有访问所有权语义,模块能够显式授予和获取对共享资源的访问所有权。 (2认同)