用于GDI +对象的std :: make_unique

时间:2016-06-26 11:40:36

标签: c++ c++11 c++14 gdi+

由于自动内存管理的好处,我试图将std :: unique_ptr用于我的gdi +对象。

看看这个标准的gdi + C样式代码:

Gdiplus::Graphics* graphics = Gdiplus::Graphics::FromImage(image);
graphics->DrawRectangle(/* parameters */); // Working

我知道我可以使用std :: unique_ptr,如下所示:

std::unique_ptr<Gdiplus::Graphics> graphics(Gdiplus::Graphics::FromImage(image));
graphics->DrawRectangle(/* parameters */); // Working

现在我想用std :: make_unique构造std :: unique_ptr,但我无法编译它。

我尝试了以下内容:

std::unique_ptr<Gdiplus::Graphics> graphics = std::make_unique<Gdiplus::Graphics>(Gdiplus::Graphics::FromImage(image));
graphics->DrawRectangle(/* parameters */); // Not working

但是我收到以下转换错误: C2664无法从“HDC”中的“Gdiplus :: Graphics”转换1个参数。

我使用的是最新版本的VS2015。

我认为std :: make_unique应该像这样使用:

std::unique_ptr<T> varName = std::make_unique<T>(argument with which an instance of T will be constructed);

我做错了什么?

2 个答案:

答案 0 :(得分:3)

实际上,std::make_unique<T>(args...)会调用T::T(args...)(使用正确的转发)。因此,在您的情况下,您正在调用类型为Gdiplus::Graphics的{​​{1}}构造函数,这不是您的愿望。你不想在这里做独特的。但是你可以创建自己的函数,这会稍微缩短语法。

Gdiplus::Graphics*

此外,正如评论中提到的gurka一样,std::unique_ptr<Gdiplus::Graphics> make_graphics(/*whatever image is*/ image) { return std::unique_ptr<Gdiplus::Graphics>(Gdiplus::Graphics::FromImage(image)); } 超出范围后,使用std::unique_ptr运算符销毁内容。如果必须使用自定义释放方​​法销毁delete,则必须将其提供给Gdiplus::Graphics*构造函数(例如std::unique_ptr

答案 1 :(得分:0)

  

我认为std :: make_unique应该像这样使用:

std::unique_ptr<T> varName = std::make_unique<T>(argument with which an instance of T will be constructed);

  

我做错了什么?

您没有构建实例。您正在调用为您构建实例的函数,因此无法在此处使用std::make_unique