我有以下代码:
Gdiplus::Image image(filename.c_str());
UINT size = image.GetPropertyItemSize(PropertyTagExifDTOrig);
Gdiplus::PropertyItem* propertyItem = (Gdiplus::PropertyItem*)malloc(size);
问题在于此分支后的代码基于几种不同的条件。所以我想使用像std::unique_ptr
这样的东西来确保删除最后一行的指针,无论我的代码在哪里分支。
但是,std::unique_ptr
似乎不能在此轻松实施。它似乎需要固定大小的类型,并且不支持自定义大小。
这是对的吗?有没有什么好方法可以在这里实现自动指针?
答案 0 :(得分:2)
std::unique_ptr
支持自定义删除工具。由于您使用malloc
进行分配,因此可以使用free
:
std::unique_ptr<Gdiplus::PropertyItem, void (*)(void*)> propertyItem{
(Gdiplus::PropertyItem*) std::malloc(size), &std::free};
如果您希望避免传递删除器,可以创建一个为您执行删除的结构:
struct FreeDeleter {
void operator()(void* p) {
std::free(p);
}
};
std::unique_ptr<Gdiplus::PropertyItem, FreeDeleter> propertyItem{
(Gdiplus::PropertyItem*) std::malloc(size)};
答案 1 :(得分:0)
std::unique_ptr<Gdiplus::PropertyItem[]> pitem(new Gdiplus::PropertyItem[size]);
std::unique_ptr<Gdiplus::PropertyItem[]> pitem = std::make_unique<Gdiplus::PropertyItem[]>(size);