Toon posts:

[C++] Heap problemen?

Pagina: 1
Acties:

Verwijderd

Topicstarter
In een vorig topic was mijn probleem een heap corruptie. Ik heb destijds de wereld aan _CrtCheckMemory aanroepen over de gehele applicatie geplaatst (wat een rotwerk ;)) en heb toen alle problemen op weten te lossen. Echter zit ik nu met het volgende probleem:

Ik heb een functie die de volgende structuur kent:

code:
1
2
3
4
5
6
7
8
void Klasse::SetContents(DataClass *pDataClass)
{
   pDataClass->setMemberField("x", 1);
   pDataClass->setMemberField("y", 2);
   pDataClass->setMemberField("z", 3);

   // Hier is de inhoud van pDataClass zoals deze zou moeten zijn
}


De Klasse class fungeert als een tolk tussen de DataClass en de database. Hij zorgt ervoor dat de gegevens vanuit de database worden geladen en dat ze weer worden opgeslagen wanneer nodig.

De gegevens uit de database worden dus opgehaalt en vervolgens in de members van DataClass opgeslagen. Voordat de SetContents methode de methode verlaat staan alle gegevens prima in de klasse.

Echter, en dit is mijn probleem, word de inhoud van de DataClass helemaal overhoop gehaald op het moment dat de methode retourneert. De eerste regel na de methode aanroep krijgt een compleet ander beeld van de klasse dan binnen in de methode.

Deze methodes liggen verspreid over meerdere DLL's. Echter, omdat er imho geen geheugen worden gealloceerd, danwel wordt vrijgegeven dan zou dit echter geen problemen mogen geven.

Indien iemand een idee heeft waardoor dit veroorzaakt zou kunnen worden dan hoor ik het graag :D.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Gokje: je werkt met pointers zonder heel duidelijk te documenteren wat je ermee aan het doen bent. Een DataClass* zonder verder commentaar is vragen om ongelukken.

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

Kun je de inhoud van setMemberField() posten? Misschien denk je C-strings te vergelijken, terwijl je eigenlijk hun locaties vergelijkt ofzo...

  • Wilke
  • Registratie: December 2000
  • Laatst online: 10:46
Verwijderd schreef op maandag 19 februari 2007 @ 10:11:
Echter, en dit is mijn probleem, word de inhoud van de DataClass helemaal overhoop gehaald op het moment dat de methode retourneert. De eerste regel na de methode aanroep krijgt een compleet ander beeld van de klasse dan binnen in de methode.
Gezien de symptomen, zou het kunnen dat je pointers naar waarden op de stack in die DataClass plaatst. Die verdwijnen zodra je uit die functie springt.

Oftewel het equivalent van dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string.h>
#include <stdio.h>

char* f()
{
  char s[4];
  strncpy(s, "hoi", 4);
  printf("%s\n", s); /* Werkt prima */

  return s;
}

int main(int argc, char** argv)
{
  printf("%s\n", f()); /* Werkt niet */
}


Kijk maar eens wat dat doet, en waarom. Hetzelfde zou (in C++) gebeuren als je zoiets doet als:

pDataClass->setMemberField(s, 1);

waarbij variable s dus een pointer is naar iets dat op de stack staat (bijvoorbeeld dus omdat het een "static" string is die je hebt gedeclareerd op vergelijkbare wijze als ik hierboven).

Dit lijkt prima te werken, totdat je de betreffende functie/methode verlaat.

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Verwijderd schreef op maandag 19 februari 2007 @ 20:49:
Kun je de inhoud van setMemberField() posten? Misschien denk je C-strings te vergelijken, terwijl je eigenlijk hun locaties vergelijkt ofzo...
ik hoop stilletjes dat de signatuur er zo uit ziet:
C++:
1
void CDataClass::setMemberField(const std::string& field, const int value)


want als je
C++:
1
void CDataClass::setMemberField(const char* const field, const int value)


hebt kan er idd wel eens iets raar gebeuren...

ASSUME makes an ASS out of U and ME