Toon posts:

[C++ heap probleem !!]

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo mensen,

In VC++ loop ik op een stuk code vast. Ik vraag via ADO de systeem tabellen op van een MS SQL database. Deze tabellen wil ik een een combobox zetten. Dit gaat goed behalve als ik de bewerking meerdere keren uitvoer (dus als ik van verschillende databases de tabellen opvraag). De debugger geeft aan dat er iets fout gaat met het vrijmaken van de heap. Ik snap echt niet wat er fout gaat. Waarschijnlijk heeft het te maken met het voorgedefineerde windowstype _bstr_t, maar ik ben niet zo thuis hiermee. Kan iemand mij vetellen wat er fout gaat en /of hoe ik het kan oplossen. (als ik gewoon met het handje een loop maak van 1000 ofzo iets gaat het niet mis, dus de combobox kan we de hoeveelheid data aan) hieronder een fragment van mijn code

code:
1
2
3
4
5
6
7
if(!pRst->EndOfFile) {
      do {
                SendMessage(hBox, CB_INSERTSTRING, -1,(LPARAM)(LPCSTR)(_bstr_t)    pRst->Fields->Item["TABLE_NAME"]->Value);
                pRst->MoveNext();
      }while(!pRst->EndOfFile);         
return true;
}


De SendMessage... regel bestaat uit 2 regels, maar is wel gewoon 1 regel (past er nie helemaal op :) Op deze regel gaat het overigens ook fout

  • whoami
  • Registratie: December 2000
  • Laatst online: 20:46
Als je geheugen alloceert, moet je dat ook weer vrijgeven indien dit niet meer nodig is.

Maar goed, wat het exacte probleem is, is ook maar gissen met zoweinig informatie...
Post misschien eens de volledige foutmelding, en zeg ook eens wanneer je die foutmelding precies krijgt.
Debug ook jouw programma eens en post eens het code-fragment die de foutmelding heeft, en zeg ook op welke regel je die fout krijgt.

https://fgheysels.github.io/


Verwijderd

Hmmz cast na cast na cast na cast... ging geen lampje branden dat dat evt best es 'n probleem kon gaan opleveren toen je die code schreef?

Verwijderd

Topicstarter
De cast is geen probleem, de cast _bstr_t wel. De exacte fout is:
Expression _CtrCheckMemory()
File: dbgheap.c line 1100

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Je cast Value eerst naar een _bstr_t, daarna naar een char const*, daarna naar een long. Dat kan niet goed zijn, al was het alleen maar omdat _bstr_t een Unicode string is, geen ASCII/char string. Wat wil je eigenlijk?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Value in een combobox gooien, maar ik snap die _bstr_t ook niet helemaal, dat is volgens MSDN een *char, en die moet op de een of andere manier naar een LPARAM

Verwijderd

_bstr_t doet automatish een ConvertBSTRToString op het moment dat je 'm naar 'n char const * cast MSalters dus dat is geen probleem. Dat je daarna *ZELF* verantwoordelijk bent voor het vrijgeven van het geheugen hoeft ook geen probleem te zijn. Maar je moet 't wel weten. zoals ik al zei WEET wat je casts doen anders is het een *SLECHT* idee.

[ Voor 5% gewijzigd door Verwijderd op 24-11-2002 23:05 . Reden: _bstr_t managed toch de char const * voor je. ]


Verwijderd

Topicstarter
kijk daar zocht ik ook naar, hoe geef ik het geheugen dan vrij ??? :)

Verwijderd

Ehh niet ik zie net dat _bstr_t die const char * wel voor je managed en netjes vrijgeeft op het moment dat de destructor afgaat

Verwijderd

Topicstarter
ja daarom snap ik ook niet dat m'n geheugen volloopt !!

Verwijderd

Ik zou zeggen ipv cast na cast na cast splits 'm op in losse regels en kijk waar ie leaked met boundschecker of purify?

Verwijderd

Topicstarter
dat is m nou juist leak zit m in die irritante _bstr_t, ik moet het geheugen dus op de een of andere manier zelf vrij geven.

Verwijderd

Topicstarter
heb het probleem denk gevonden. Ik lees via een omweg van 2 dagen....

_bstr_t( char* s2 ) Constructs a _bstr_t object by calling SysAllocString to create a new BSTR object and encapsulate it. This constructor first performs a multibyte to Unicode conversion.
If s2 is too large, you may generate a stack overflow error. In such a situation, convert your char* to a wchar_t with MultiByteToWideChar and then call the wchar_t * constructor.

Wel vaag, je moet het dus alsnog met het handje doen !! Wat is dan het voordeel van _bstr_t

[ Voor 17% gewijzigd door Verwijderd op 24-11-2002 23:21 ]


Verwijderd

voordeel is dat als ie werkt je niet steeds overal SysFreeString hoeft aan te roepen. en dat je'm kan casten naar const char * zodat je je code niet bevuild met allerlei nare ConvertBSTRtoString calls.. voordelen genoeg aan die class (net als de _variant_t) je moet alleen n bietje opletten wat je er mee doet want 't wil wel es wat gaan leaken..
Pagina: 1