首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用飞权模式在位图对象之间共享位图

使用飞权模式在位图对象之间共享位图
EN

Stack Overflow用户
提问于 2009-09-30 09:06:15
回答 2查看 1.1K关注 0票数 4

你好堆栈覆盖,我有一个设计,它使用飞重模式来共享位图,这些位图是在管理绘图操作等的位图对象之间共享的,并集成到gui库中。这是一个嵌入式设备,所以内存是最重要的。目前,我已经用计算使用量的轻型类的std::auto_ptr实现了一个工作实现。我知道这是个坏主意,可能会泄露,所以我要重写这个部分。我正在考虑使用boost::shared_ptr。我问题的关键是,如果没有使用,我希望发布的位图。如果我有一个shared_ptr池,我只加载一次使用过的位图。我正在考虑使用shared_ptr::use_count()删除位图,如果use_count() == 1的话,但是文档对use_count()的生产代码发出警告。从根本上讲,这个问题是随着个别重物的释放而产生的飞行重量模式。你觉得有更好的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-30 09:30:52

您可以使用一个boost弱指针池,以便池在所有权中不算在内。

只有位图对象有增强共享指针,这样它们才能决定何时发布位图。

弱指针池允许我们检索已经构造的位图:

创建位图对象时,您可以:

如果弱指针不是空的,则

  • 从该弱指针获取共享指针,
  • 或以其他方式加载新的位图,从中生成一个新的共享指针,并在池中插入/替换弱指针。

下面是一些使用池映射的示例代码:

代码语言:javascript
运行
复制
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <map>
#include <string>
#include <iostream>

// represents the bitmap data
class Bitmap
{
public :
    Bitmap( std::string const& name ) : name( name )
    {
        std::cout << "Bitmap " << name << std::endl ;
    }

    ~Bitmap()
    {
        std::cout << "~Bitmap " << name << std::endl ;
    }

    std::string name ;
};

// the flyweight pool
class Factory
{
public :

    typedef std::map< std::string , boost::weak_ptr< Bitmap > > Map ;

    boost::shared_ptr< Bitmap > get( std::string const& what )
    {
        Map::iterator x = map.find( what );

        // retrieve existing object from map's weak pointers

        if( x != map.end() )
        {
            if( boost::shared_ptr< Bitmap > shared = x->second.lock() )
            {
                return shared ;
            }
        }

        // populate or update the map

        boost::shared_ptr< Bitmap > shared( new Bitmap( what ) );
        boost::weak_ptr< Bitmap > weak( shared );
        map.insert( std::make_pair( what , weak ) );
        return shared ;
    }

private :
    Map map ;
};


int main(int argc, char** argv)
{
    Factory f ;

    // we try our flyweight bitmap factory ...

    boost::shared_ptr< Bitmap > a = f.get( "a" );
    boost::shared_ptr< Bitmap > b = f.get( "b" );

    // a is not made again
    boost::shared_ptr< Bitmap > a2 = f.get( "a" );

    a.reset();
    a2.reset();

    // a is destroyed before ------

    std::cout << "------" << std::endl ;
}
票数 7
EN

Stack Overflow用户

发布于 2009-09-30 09:29:19

shared_ptr的思想是它为您管理对象生命周期。你不应该检查使用计数。为每个用户设置一个shared_ptr,删除用户时删除shared_ptrs,当没有其他用户时,它将为您删除位图。如果您需要调用一个特殊的例程来删除位图,并且不能只在析构函数中这样做,那么您可以在创建时将一个特殊的删除函数传递给shared_ptr。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1496930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档