C++ std::唯一的_ptr和指针到指针

C++ std::唯一的_ptr和指针到指针,c++,c++11,unique-ptr,C++,C++11,Unique Ptr,我想结合FreeImage的FITAG使用std::unique_ptr。普通C语言中的代码是: ... load image; FITAG* tag = NULL; FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", &tag); ... do some stuff with tag; FreeImage_DeleteTag(tag); ... delete image; 我尝试使用unique_ptr: std::

我想结合FreeImage的FITAG使用
std::unique_ptr
。普通C语言中的代码是:

... load image;

FITAG* tag = NULL;
FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", &tag);
... do some stuff with tag;
FreeImage_DeleteTag(tag);

... delete image;
我尝试使用unique_ptr:

std::unique_ptr<FITAG, void(*)(FITAG*)> tag(NULL, &FreeImage_DeleteTag);
FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", &tag.get());
我该如何解决这个问题

先谢谢你

tag.get()
这将返回一个r值。无法获取r值(临时)的地址。您最好的选择是这样做:

auto ptr = tag.get();
FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", &ptr);
这将允许您将FITAG**传递到函数中。如果要将FITAG*传递给函数,只需删除&since标记。get()返回指针,而不是值

FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", tag.get());

颠倒操作顺序;首先获取资源,然后构建
唯一\u ptr

FITAG *p = NULL;
FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", &p);
std::unique_ptr<FITAG, void(*)(FITAG*)> tag(p, &FreeImage_DeleteTag);
FITAG*p=NULL;
FreeImage_GetMetadata(FIMD_EXIF_EXIF、位图、“属性”&p);
std::unique_ptr标记(p和FreeImage_DeleteTag);

否,FreeImage\u GetMetadata需要一个FITAG**。如果FreeImage\u DeleteTag没有unique\u ptr可以接受的签名,那么编写一个包装函数,该函数确实有必要的签名,然后适当地调用FreeImage\u DeleteTag。您的第一个示例将编译,但是
unique\u ptr
将不再拥有由
FreeImage\u GetMetadata
分配的资源。
FITAG *p = NULL;
FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", &p);
std::unique_ptr<FITAG, void(*)(FITAG*)> tag(p, &FreeImage_DeleteTag);