Windows COM C ++ - Brug sletning eller frigivelse

Indlæg af Hanne Mølgaard Plasc

Problem



Hurtigt spørgsmål Jeg ville gerne spørge, jeg har en Direct2D-fabrik, og når jeg gør mig klar til oprydning, vil jeg ringe slette eller bruge frigivelsesmedlem? Jeg ser nogle vejledninger, der netop kalder slette eksplicit, så jeg var nysgerrig efter, hvad der er sikrere, medmindre alt udgivelsesmedlemmet gør, er at kalde slette i baggrunden osv.


Graphics::~Graphics() {

    if (Factory) //Factory->Release(); or  delete Factory;
    if (Render) //Render->Release();  or delete Render;
}

Bedste reference


Den rigtige måde at frigive COM-grænseflader på er at kalde Release -metoden på grænsefladepegeren.


delete er til C ++-objekter allokeret med new på bunken, ikke til COM-grænsefladepegere.


Bemærk at du også kan omhyggeligt pakke rå COM-grænsefladepegere ved hjælp af intelligente pegerklasser som ATLs CComPtr. I dette tilfælde kaldes Release -metoden automatisk , når smartpegeren går uden for anvendelsesområdet.


Hvis du f.eks. Bruger intelligente pegerindpakninger til dataelementerne Factory og Render i dit eksempel, behøver du ikke udtrykkeligt at ringe Release i Graphics destructor: C ++-kompilatoren automatisk kalder destruktorerne på hvert data medlem, hvilket vil resultere i Release bliver kaldt til de indpakket COM-grænseflader.

Andre referencer 1


selvfølgelig Release(); og kun dette på grænseflademetode. og du kan kun kalde delete for hukommelse, som du tidligere har tildelt af egen new. altid fejlopkald delete for hukommelse tildelt fra eksterne DLL fordi de nye/slette ikke kan matche din nye/slette