【问题标题】:How to return a GDI::Bitmap from a function如何从函数返回 GDI::Bitmap
【发布时间】:2013-10-24 15:27:35
【问题描述】:

如何从函数返回位图? 此代码不起作用:编译器错误

 Gdiplus::Bitmap create()
 {
       Gdiplus::Bitmap bitmap(10,10,PixelFormat32bppRGB);

       // fill image
       return bitmap;
 }

我不想返回一个指针,因为它会产生内存泄漏的机会。 (或者如果有办法避免这种内存泄漏的机会)

【问题讨论】:

  • Bitmap 类有一个私有的复制构造函数来防止你复制。有意地,位图的副本完全占用了太多的内存。你确实需要返回一个指针。显然,它不能是指向局部变量的指针,需要使用 new
  • @Hans:实际上,Gdiplus::Bitmap 确实应该有一个移动构造函数,这将使上述代码既有效又(因为它已经只是句柄值的包装器)最优。希望这些包装器尽快获得 C++11 更新。

标签: c++ bitmap gdi+


【解决方案1】:

当您从函数返回对象时,编译器需要生成代码来复制或(在 C++11 中)移动该对象。

Gdiplus::Bitmap 没有可访问的复制构造函数(并且早于 C++11,因此也不能移动),因此不允许您这样做。根据您使用它的方式,您可能会考虑使用 std::unique_ptrstd::shared_ptr 之类的东西。

或者,您可能希望在父级中创建Bitmap,并简单地传递一个指针或对它的引用,让您的函数根据需要填充它。

【讨论】:

    【解决方案2】:

    如果您想要代码。这就是您将指针传回的方式。

    Gdiplus::Bitmap* create()
    {
        Gdiplus::Bitmap* bitmap = new Gdiplus::Bitmap(10,10,PixelFormat32bppRGB);
    
        // fill image
        return bitmap;
    }
    

    这样不行吗?

    void create(Gdiplus::Bitmap& bitmap)
    {
        bitmap = *(new Gdiplus::Bitmap(10,10,PixelFormat32bppRGB));
    }
    

    上下文应该是这样的

    int main()
    {
        Gdiplus::Bitmap bitmap; //ONLY WORKS IF IT HAS DEFAULT CONSTRUCTOR
        create(bitmap);
    }
    

    我对 Gdiplus 不熟悉,所以如果没有默认构造函数,那是行不通的。

    【讨论】:

    • 谢谢。这段代码的问题是,如果调用者忘记删除位图,那么我们就有内存泄漏。
    • 这是真的。我想这取决于你为谁写这篇文章。如果您信任程序员,那很好。如果你不这样做,那么使用智能指针!正如 Jerry Coffin 所提到的
    猜你喜欢
    • 2010-11-12
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多