webForumDet fria alternativet

operator new - Varför krashar denna kod?

C/C++ur C/C++

13 svar · 357 visningar · startad av Sang-drax

Medlem sedan juli 2002581 inlägg
Frågan#1

Jag har försökt att överlagra new och delete.
Varför krashar denna kod?

#include <iostream>

using namespace std;

bool InutiNew = false;
bool InutiDelete = false;

//Min egen version av new operatorn
void* operator new( size_t storlek )
{
    if(!InutiNew )
    {
        InutiNew = true;
        cout << "Minne allokerat : " << storlek
             << " bytes\n";
        InutiNew = false;
    }

    return malloc( storlek );
}

// User-defined operator delete.
void operator delete( void *Mem )
{

    if(!InutiDelete)
    {
        InutiDelete = true;
        cout << "Minne deallokerat\n";
        InutiDelete = false;
    }

    free( Mem );
}

int main( int argc, char *argv[] )
{
    //allokera
    int* p = new int;
    //deallokera
    delete p;
    return 0;
}
Medlem sedan juli 2002581 inlägg
#2

Hehe jag löste det själv:

Jag lade till denna globala variabel:

bool ProgramHarStartat = false;

Testet inuti new ser nu ut så här:

if( ProgramHarStartat && !InutiNew )

och först i main() skriver jag

ProgramHarStartat = true;

Anledningen är att cout behöver lite initialeringskod innan den kan användas, kod som ligger före main(). I denna kod anropas nog new och då blir cout-anropet i new() ett anrop till ett icke initerat objekt.
Heh.. :birp

Medlem sedan juni 200010 432 inlägg
#3

Wooo.
Kul test.. men om du slängt in din operatoröverlagring som metoder i en egen klass och initierat den hade du sluppit denna flagga (flaggor är f.ö typiskt sånt som tillhör strukturerade språk som C och man bör undvika sånt i OOP - språk). Kanske nåt att tänka på vid vidare experimenterande :)

Medlem sedan okt. 20013 217 inlägg
#4

Fram för mer flaggor. Eller hur tänker du lösa ett objekts olika tillstånd ? ENUM heter dom kanske, men i praktiken så är det ju samma sak.

Medlem sedan juni 200010 432 inlägg
#5

Beatbox skrev:

Fram för mer flaggor. Eller hur tänker du lösa ett objekts olika tillstånd ? ENUM heter dom kanske, men i praktiken så är det ju samma sak.

Beror på hur man byggt upp designen. Ren OOP eller halvstrukturerad hybridkod - välj själv ;)

Medlem sedan okt. 20013 217 inlägg
#6

Tillståndsmaskiner är nu nått som inte kommer att försvinna bara för man använder OOP.

Medlem sedan juni 200010 432 inlägg
#7

Nej, men globala flaggor :)

Medlem sedan juli 2002581 inlägg
#8

PeW skrev:

Wooo.
Kul test.. men om du slängt in din operatoröverlagring som metoder i en egen klass och initierat den hade du sluppit denna flagga (flaggor är f.ö typiskt sånt som tillhör strukturerade språk som C och man bör undvika sånt i OOP - språk). Kanske nåt att tänka på vid vidare experimenterande :)

Men då fungerar ju den operatorn bara med den klassen. Jag ville spåra alla allokeringar som skedde i mitt program, inte bara för en specifik klass.

int* p = new int; //global operator används

(Lämpligtvis läggs den globala variablen i sitt eget namespace eller något för att undvika konflikter)

Medlem sedan okt. 20013 217 inlägg
#9

Du kan väl göra template-metoder för de typer som du vill överlagra.

Medlem sedan aug. 2001458 inlägg
#10

Har du funderat på att använda en färdig debug heap? Har du MSVC++ är C-runtimens debug heap bra.

Medlem sedan okt. 20013 217 inlägg
#11

Är inte den default om man bygger debug ?

Medlem sedan aug. 2001458 inlägg
#12

Beatbox skrev:

Är inte den default om man bygger debug ?

Hmm... Jo, det är den ju förstås. Men man måste säga till den om man vill att den ska leta minnesläckor.

static void NoLeak()
{
	delete[] (new byte[123]);
}

static void Leak()
{
	new byte[456];
}

void main()
{
	::_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
	Leak();
	NoLeak();
}

ger om man kör under debuggern utskriften

Detected memory leaks!
Dumping objects ->
{85} normal block at 0x00375378, 456 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Medlem sedan juli 2002581 inlägg
#13

Beatbox skrev:

Du kan väl göra template-metoder för de typer som du vill överlagra.

Exempel?
Jag vet inte riktigt hur du menar men är tveksam att det skulle gå.

Medlem sedan juli 2002581 inlägg
#14

developer skrev:

Har du funderat på att använda en färdig debug heap? Har du MSVC++ är C-runtimens debug heap bra.

Tja, jag gjorde det mest för att lära mig lite. Jag hade väl kunnat ladda hem nån färdig garbage-collector med smarta pekare och hela faderullan annars.

135 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)