std :: unique_ptr和指针指针

时间:2014-07-03 00:20:00

标签: c++ c++11 unique-ptr

我想将std::unique_ptr与FreeImage的FITAG结合使用。普通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());

显然会回归:

cannot take the address of an rvalue of type 'pointer' (aka 'FITAG *')

我该如何解决这个问题?

提前多多感谢。

2 个答案:

答案 0 :(得分:8)

颠倒操作顺序;首先获取资源,然后构建unique_ptr

FITAG *p = NULL;
FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", &p);
std::unique_ptr<FITAG, void(*)(FITAG*)> tag(p, &FreeImage_DeleteTag);

答案 1 :(得分:3)

tag.get()

返回r值。您无法获得r值(临时)的地址。你最好的办法就是这样做:

auto ptr = tag.get();
FreeImage_GetMetadata(FIMD_EXIF_EXIF, bitmap, "Property", &ptr);

这将允许您将FITAG **传递给该函数。如果你打算将FITAG *传递给函数,只需删除&amp;因为tag.get()返回指针,而不是值。

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