由于自动内存管理的好处,我试图将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);
我做错了什么?
答案 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
。