---
title: "operator new - Varför krashar denna kod?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/c-cpp/52597-operator-new-varför-krashar-denna-kod"
topic: "C/C++"
topic_url: "https://www.webforum.nu/amne/c-cpp"
author: "Sang-drax"
published: "2002-09-08T15:24:49.000Z"
updated: "2002-09-10T17:22:54.000Z"
replies: 13
views: 391
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/c-cpp/52597-operator-new-varför-krashar-denna-kod"
---

# operator new - Varför krashar denna kod?

## #1 — Sang-drax, 2002-09-08T15:24Z

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;
}
```

Permalänk: https://www.webforum.nu/p/52597

## #2 — Sang-drax, 2002-09-08T15:35Z

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

Permalänk: https://www.webforum.nu/p/778192

## #3 — PeW, 2002-09-08T15:48Z

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  :)

Permalänk: https://www.webforum.nu/p/778201

## #4 — Beatbox, 2002-09-08T16:45Z

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.

Permalänk: https://www.webforum.nu/p/778232

## #5 — PeW, 2002-09-08T20:15Z

> **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  ;)

Permalänk: https://www.webforum.nu/p/778408

## #6 — Beatbox, 2002-09-09T04:28Z

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

Permalänk: https://www.webforum.nu/p/778488

## #7 — PeW, 2002-09-09T05:59Z

Nej, men globala flaggor  :)

Permalänk: https://www.webforum.nu/p/778508

## #8 — Sang-drax, 2002-09-09T16:21Z

> **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)

Permalänk: https://www.webforum.nu/p/778977

## #9 — Beatbox, 2002-09-09T16:30Z

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

Permalänk: https://www.webforum.nu/p/778986

## #10 — developer, 2002-09-09T16:54Z

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

Permalänk: https://www.webforum.nu/p/779005

## #11 — Beatbox, 2002-09-09T16:57Z

Är inte den default om man bygger debug ?

Permalänk: https://www.webforum.nu/p/779009

## #12 — developer, 2002-09-09T18:05Z

> **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
```

Permalänk: https://www.webforum.nu/p/779064

## #13 — Sang-drax, 2002-09-10T17:21Z

> **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å.

Permalänk: https://www.webforum.nu/p/779911

## #14 — Sang-drax, 2002-09-10T17:22Z

> **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.

Permalänk: https://www.webforum.nu/p/779914

---

Tråden på webben: https://www.webforum.nu/amne/c-cpp/52597-operator-new-varför-krashar-denna-kod
