[c++] crt mix en new/delete

Pagina: 1
Acties:

  • demonite
  • Registratie: April 2000
  • Laatst online: 29-05 08:55

demonite

the way is up

Topicstarter
ik heb een QT dll met /MD gecompileerd (release mode)
ik heb een applicatie die met /MDd is gecompileerd (debug mode)

In mijn applicatie heb ik new en delete geoverload.
C++:
1
2
3
4
5
6
7
8
void* operator new( size_t n ) { 
   return malloc( n ); 
}

void operator delete( void* p )
{ 
   free( p ); 
}


en een stukje code

C++:
1
2
3
4
5
6
7
void a::start() {
   pLabel = new QLabel( ... );
}

void a::stop() {
   delete pLabel;
}



Kan iemand mij uitleggen waarom start() wel gebruik maakt 'mijn' new maar stop() niet van 'mijn' delete ?

Sommige classes worden nml wel opgeruimd door 'mijn' delete (QPtrList, QMap) maar dit QLabel niet, en zo zijn er nog meer....

Ik vermoed dat het iets te maken heeft met de mix van msvcrt.dll en msvcrtd.dll... Maar hoe / waarom.... ?

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21-08 13:30

BoAC

Memento mori

Gebruik es:
C++:
1
delete (pLabel);

  • demonite
  • Registratie: April 2000
  • Laatst online: 29-05 08:55

demonite

the way is up

Topicstarter
helaas, dat hielp niet...

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21-08 13:30

BoAC

Memento mori

Gevindt:
Microsoft MSDN
Je moet dus het volgende doen:

C++:
1
2
3
#include <iostream>

using namespace std;


Daarna je new en delete implementatie ;)

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

Ik vind 't maar eng allemaal.

Ten eerste, waarom wil je dit?
Ten tweede, wat denk je dat er gebeurt wanneer een class een destructor heeft?
Ten derde, waarom zouden msvcrt en msvcrtd er iets mee te maken hebben?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Pooh schreef op 02 oktober 2003 @ 12:36:
Ik vind 't maar eng allemaal.

Ten eerste, waarom wil je dit?
Memory management? Leak control? Memory queuing tbv performance?
Ten tweede, wat denk je dat er gebeurt wanneer een class een destructor heeft?
Gaat perfect, operators new en delete mag je gewoon 'at will' overloaden volgens de C++ standaard. Ze worden nl. pas aangeroepen respectievelijk voor en na de destructor :)

Professionele website nodig?


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21-08 13:30

BoAC

Memento mori

Yep in principe doet MFC dat ook:
C++:
1
2
3
4
5
6
7
8
void __cdecl operator delete(void* p)
{
#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
        _free_dbg(p, _NORMAL_BLOCK);
#else
        free(p);
#endif
}

  • demonite
  • Registratie: April 2000
  • Laatst online: 29-05 08:55

demonite

the way is up

Topicstarter
Ten derde, waarom zouden msvcrt en msvcrtd er iets mee te maken hebben?
Omdat er in msvcrtd nml ook een operator delete zit. (dbgdel.cpp) Als ik nml de QT library ook met /MDd compileer krijg ik daar dus asserts op.

Ik ben erachter gekomen dat mijn delete niet aangeroepen wordt omdat ik een user breakpoint krijg vanuit NTDLL ... en er een Heap msg in mijn debug window verschijnt:

HEAP[dynamo.exe]: Invalid Address specified to RtlFreeHeap( 086A0000, 0005BB50 )

Dit soort meldingen krijg je over het algemeen als een bepaald stuk geheugen vrij gegeven wordt door een andere heap manager als die het heeft gealloceerd.

Dat is ook 1 van de redenen dat ik dus new en delete heb geoverload.


BoAc: using namespace std; hielp ook niet helaas... Thnx for the effort iig. Als je nog meer tips hebt... graag :)

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21-08 13:30

BoAC

Memento mori

En als je extern voor je delete en new functie zet?

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

curry684 schreef op 02 October 2003 @ 12:43:
[...]

Memory management? Leak control? Memory queuing tbv performance?

[...]

Gaat perfect, operators new en delete mag je gewoon 'at will' overloaden volgens de C++ standaard. Ze worden nl. pas aangeroepen respectievelijk voor en na de destructor :)
Hmm... 'k Dacht altijd dat je alleen de new/delete voor een bepaalde class mocht overloaden, niet dat je de global new/delete mocht overloaden, maar wellicht heb ik 't fout (of lees ik iets niet goed in zijn code)

  • demonite
  • Registratie: April 2000
  • Laatst online: 29-05 08:55

demonite

the way is up

Topicstarter
'tis idd een global new/delete.. Maar dat is de bedoeling ook, op de link van BoAC naar de MSDN gebeurd het ook... en in msvcrtd dus ook..

Dus dat lijkt me wel ok.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Pooh schreef op 02 October 2003 @ 13:03:
[...]
Hmm... 'k Dacht altijd dat je alleen de new/delete voor een bepaalde class mocht overloaden, niet dat je de global new/delete mocht overloaden, maar wellicht heb ik 't fout (of lees ik iets niet goed in zijn code)
Je hebt het fout ;)

Professionele website nodig?


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21-08 13:30

BoAC

Memento mori

Kun je de delete operator niet in tracen met debug? Waar gaattie dan naartoe?

  • demonite
  • Registratie: April 2000
  • Laatst online: 29-05 08:55

demonite

the way is up

Topicstarter
chkstk.asm :S

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Pooh heeft misschien een punt; een class mag operator new&delete overloaden. Alleen zou dat in combinatie moeten gebeuren, dus dat verklaart jouw observatie niet.

delete() of namespace std:: zijn onzin.

Qt heeft de eigenschap om zelf delete aan te roepen voor objecten, in het binzonder QWidgets. Wat jij beschrijft is dat QWidgets fout gaan, en andere classes oed.Kin je dat verder checken?

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


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21-08 13:30

BoAC

Memento mori

MSalters schreef op 02 October 2003 @ 14:02:
..
delete() of namespace std:: zijn onzin.
..
Getuige mijn link 8)7 :? 8)7

Misschien moet de topic starter es hier kijken:
Google

  • demonite
  • Registratie: April 2000
  • Laatst online: 29-05 08:55

demonite

the way is up

Topicstarter
Op het moment dat ik die RtlFreeHeap melding krijg is dit de stack:

NTDLL! 77f75a58()
NTDLL! 77f9e139()
NTDLL! 77f85010()
NTDLL! 77f58b37()
MSVCRT! 77c2ab2e()
QLabel::`vector deleting destructor'(unsigned int 1) + 103 bytes
a::stop() line 158

en line 158 is delete( pLabel );

wat die vector deleting destructor voor iets is weet ik eigenlijk niet, eens kijken wat daar over te vinden valt... want daar staat niet echt code achter als ik het zo 's bekijk...

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21-08 13:30

BoAC

Memento mori

Klein (misschien stom) vraagje: Werk je met dlls waar je in de ene geheugen aanmaakt en datzelfde geheugen in een andere dll/executable verwijderd?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
De destructor QLabel::~QLabel zal toch eerst moeten returnen voordat jouw operator delete kan worden aangeropen. Zo te zien faalt die dtor al, dus het probleem is niet dat er iets mis s met jouw operator delete.
Wat er dus wel fout lijkt te gaan is een delete/RtlFreeHeap call vanuit QLabel::~QLabel

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


  • demonite
  • Registratie: April 2000
  • Laatst online: 29-05 08:55

demonite

the way is up

Topicstarter
kijk nou eens... het roept wel degelijk delete aan. Alleen is dat niet mijn delete, deze zit zo te zien in msvcrt.dll

GAS:
1
2
3
4
QLabel::`vector deleting destructor':
39E21B80   push        ebp
...
39E21BE2   call        operator delete (3a06dc80)



Daar waar mijn delete wel aangeroepen wordt gaat het om niet-Qt classes of afgeleide Qt classes... Daar lijkt het iig op.

Hmff.. zou het dan toch aan msvcrt / msvcrtd liggen ?

  • demonite
  • Registratie: April 2000
  • Laatst online: 29-05 08:55

demonite

the way is up

Topicstarter
ahnee, ik denk dat ik het al weet.

de new gebeurd vanuit mijn code, dus daarom wordt 'mijn' new gebruikt.
bij een delete (van die qt class) roept die QLabel::vector deleting destructor de operator delete aan. Maar aangezien Qt een dll is weet die niets van mijn overload en roept de standaard delete aan..

Stel dat dat zou kloppen... hoe kan je dat dan veranderen ?

  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21-08 13:30

BoAC

Memento mori

Niks gezegd 8)7 8)7 |:( :'(

[ Voor 172% gewijzigd door BoAC op 02-10-2003 16:00 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
destructor != operator delete, de laatste is een free function en dus nooit virtual.

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


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

demonite schreef op 02 October 2003 @ 15:23:
hoe kan je dat dan veranderen ?
dan moet je statisch linken met Qt (geen idee of dat kan).


en BoAC: verschillende reacties van jou in deze thread slaan eigenlijk nergens op. Als je er geen verstand van hebt, reageer dan niet. Niet lullig bedoeld hoor, en je bedoelt het zelf waarschijnlijk ook wel goed, maar als je onzin gaat roepen dan help je de TS daar verder ook niet mee (integendeel zelfs). Dus probeer je voortaan wat in te houden voordat je zomaar iets roept, ok? :)

[ Voor 5% gewijzigd door .oisyn op 02-10-2003 16:28 ]

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.


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21-08 13:30

BoAC

Memento mori

offtopic:
Yep Had better moeten lezen sorry ;)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Qt kun je inderdaad statisch linken, alleen moet je dan een Reconfigure doen. Het is waarschijnlijk makkelijker om een Debug build van Qt te maken zolang je aan het debuggen bent.

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

Pagina: 1