Toon posts:

[C++] Return van een pointer gaat niet goed

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo mensen,

ik heb een functie, deze maakt een pointer aan (MSXML2::IXMLDocumentPtr). Overal in mijn applicatie gaat dit goed en kan ik met het xml document aan de slag.
Nu ben ik bezig met een nieuwe functie in mijn applicatie, ook hierin heb ik een xml document nodig. Dus ik roep de functie weer aan, deze returnt een pointer. Als ik dan door de code stap (F11 in VC6) zie ik dat mijn functie word aangeroepen, en deze netjes een pointer returnt, maar op het moment dat ik dan terug kom in mijn functie, word mijn variabele niet geset. Een beetje moeilijk uit te leggen, ik zal het ff met wat code illustreren:

De aanroep van de functie
C++:
1
2
MSXML2::IXMLDocumentPtr pDoc        = 0;
pDoc = pNewDom();


De functie:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
MSXML2::IXMLDOMDocumentPtr pNewDom(   )
{
    bool bContinue           = true;
    MSXML2::IXMLDOMDocumentPtr pDom  = 0;         
    HRESULT hResult          = E_FAIL;
    CComVariant vtRefChild;

    try
    {
        // create dom
        if ( bContinue )
        {
            hResult = pDom.CreateInstance(__uuidof(MSXML2::DOMDocument40));
            if ( hResult == S_OK )
            {
                bContinue = true;
            }
            else
            {
                ATLTRACE("bNewDom CreateInstance(Msxml2.DOMDocument.4.0) FAILED, 0x%X", hResult);
                bContinue = false;
            }
        }
    }
    catch ( _com_error& e)
    {
        TRACE_EXCEPT( "bNewDom", e);
        bContinue = false;
    }
    return pDom;
}


Op het moment dat mijn functie bij return pDom aankomt is deze een pointer naar een XML document als ik in de watch kijk, op het moment dat ik dan weer terugkom bij pDoc = pNewDom() blijft pDoc op 0x00000000 staan, geen pointer dus...
Hoe kan deze pointer verloren gaan?

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
pDom is een lokale variabele?

{signature}


Verwijderd

Topicstarter
Ach, stomme ik ... nu ik het hier post zie ik de oplossing zelf ook direct. Mijn functie returnt een MSXML2::IXMLDOMDocumentPtr en ik declareer pDom als een MSXML2::IXMLDocumentPtr

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Mijn opmerking staat los van datatypes.
Verder heeft die hele bContinue geen nut, die is toch eerst altijd true en na het punt dat er iets opnieuw aan de variabele geassigned wordt, wordt de variabele niet meer gebruikt.

edit:
duidelijk, thx creepy

[ Voor 7% gewijzigd door Voutloos op 19-03-2007 10:44 ]

{signature}


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

pDom is als het goed is een pointer, die worden op de heap aangemaakt en niet op de stack. Waar pdDom naar verwijst blijft dus bestaan nadat de functie is beeindigt en het resultaat van de functie blijft hierdoor bruikbaar. Dat het een lokale variabele is maakt in dit geval niet uit.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Voutloos schreef op maandag 19 maart 2007 @ 10:32:
Mijn opmerking staat los van datatypes.
Verder heeft die hele bContinue geen nut, die is toch eerst altijd true en na het punt dat er iets opnieuw aan de variabele geassigned wordt, wordt de variabele niet meer gebruikt.
Wel als ik hier een gestripte versie van mijn functie heb gepost :P

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op maandag 19 maart 2007 @ 10:24:
Ach, stomme ik ... nu ik het hier post zie ik de oplossing zelf ook direct. Mijn functie returnt een MSXML2::IXMLDOMDocumentPtr en ik declareer pDom als een MSXML2::IXMLDocumentPtr
Mijn god, doet ie dan automatisch een QueryInterface oid? Want ik zou dan eerder een compile error verwachten (en hopen!), maar blijkbaar accepteert ie arbitraire conversies.

[ Voor 5% gewijzigd door .oisyn op 19-03-2007 11:43 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1