首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

TBITBMP 到底应该如何释放?

2012-04-06 
TBITBMP 到底应该怎么释放??C/C++ codebool __fastcall CBmpOp::CreateNameBoard(Graphics::TBitmap *bmpB

TBITBMP 到底应该怎么释放??

C/C++ code
bool __fastcall CBmpOp::CreateNameBoard(Graphics::TBitmap *bmpBoard,const AnsiString &strName,int fontsize,long fontcolor,int maxlen){    WideString wstrName=strName;    int strlen;    strlen=wstrName.Length();    if(strlen>maxlen)    {        strlen=maxlen;    }    bmpBoard->PixelFormat=pf24bit; //听说这个地方在BCB和DELPHI中,多线程使用的时候会出问题    bmpBoard->Width=(bmpBoard->Canvas->TextWidth("一")+2)*strlen;    bmpBoard->Height=bmpBoard->Canvas->TextHeight("一");    bmpBoard->Canvas->Brush->Color=MASKCOLOR;    bmpBoard->Canvas->Font->Color=TColor(fontcolor);    bmpBoard->Canvas->Font->Name="宋体";    bmpBoard->Canvas->Font->Height=-1*fontsize;    bmpBoard->Canvas->Font->Charset=GB2312_CHARSET;    bmpBoard->Canvas->FillRect(Rect(0,0,bmpBoard->Width,bmpBoard->Height));    int p(0);    for(int i=0;i<strlen;i++)    {        //bmpBoard->Canvas->TextOutA(p,0,wstrName.SubString(i+1,1));        ::TextOutW(bmpBoard->Canvas->Handle,p,0,wstrName.SubString(i+1,1).c_bstr(),1);        p+=bmpBoard->Canvas->TextWidth(wstrName.SubString(i+1,1))+2;    }    return true;}//测试代码    for(;;)    {          Graphics::TBitmap *bmpNameBoard=new Graphics::TBitmap();        CreateNameBoard(bmpNameBoard.....);        delete bmpNameBoard;    }


这是一个完整的函数,会在多线程中用到,我曾经试过用 try...catch ,但是从来没有收到过任何异常,而且在程序运行的时候,通过“任务管理器”观察,也没有看到内存增长。问题在于,当我把他放在多线程中的时候,表现很不稳定,经常得不到我要的结果。。。新建的 TBitbmp,并且在上面使用了GDI绘制图形,完了以后到底应该怎么释放呢??

[解决办法]
这个确实很诡异啊,以前从未听说还需要这样释放。我怀疑官方的例子中是用到了智能指针才需要这样做,当然,仅仅是怀疑。
[解决办法]
探讨
引用:

我想问,如果这个函数,始终只有一个线程在使用,并且保证在逻辑上不会并发,是否也需要lock呢??

热点排行