在对象上使用std :: unique_ptr,其大小在运行时确定

时间:2014-03-22 06:19:08

标签: c++ stl std unique-ptr

我有以下代码:

Gdiplus::Image image(filename.c_str());
UINT size = image.GetPropertyItemSize(PropertyTagExifDTOrig);
Gdiplus::PropertyItem* propertyItem = (Gdiplus::PropertyItem*)malloc(size);

问题在于此分支后的代码基于几种不同的条件。所以我想使用像std::unique_ptr这样的东西来确保删除最后一行的指针,无论我的代码在哪里分支。

但是,std::unique_ptr似乎不能在此轻松实施。它似乎需要固定大小的类型,并且不支持自定义大小。

这是对的吗?有没有什么好方法可以在这里实现自动指针?

2 个答案:

答案 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);