Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

27.05.2006, 15:00

Frage zu tbMemReAlloc()

Mal ne bescheidene Frage zu dieser Funktio hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
TRIBASE_API void* tbMemReAlloc(void* pMemory,
                               int iNewSize)
{
    int     iSize;
    void*   pNewMemory;


    // Größe des Speicherbereichs abfragen

    iSize = tbMemGetSize(pMemory);
    if(iSize == -1) return tbMemAlloc(abs(iNewSize));

    // Bei negativer neuer Größe wird der Speicherbereich vergrößert.

    if(iNewSize < 0) iNewSize = iSize - iNewSize;

    // Neuen Speicherbereich reservieren

    pNewMemory = tbMemAlloc(iNewSize);
    if(!pNewMemory) TB_ERROR_OUT_OF_MEMORY(NULL);

    // Speicher hinüberkopieren und den alten Speicherbereich löschen

    memcpy(pNewMemory, pMemory, TB_MIN(iSize, iNewSize));
    TB_SAFE_MEMFREE(pMemory);

    // Neuen Zeiger liefern

    return pNewMemory;
}


Also so wie ich das sehe reserviert diese Funktion neuen Speicher für einen lokal Pointer, kopiert den Inhalt des übergebenen Pointers rein und gibt dann die Adresse des lokalen Pointers zurück.

Aber ist diese Adresse überhaupt noch gültig nachdem die Funktion beendet wurde? Der lokale Pointer dem der Speicher zugewiesen wurde ist ja jedenfalls platt.

Lemming

Alter Hase

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

2

27.05.2006, 15:14

warum sollte der nicht mehr gültig sein, tbMemAlloc alloziiert speicher auf dem heap, und der ist solange gültig, bis der bereich wieder frei gegeben wird...
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

27.05.2006, 15:16

Der Pointer ist platt, das stimmt. Aber der Speicher auf den er gezeigt hat, ist ja immernoch reserviert. Wenn man jetzt keinen Zeiger mehr hätte, gäbe es auch keine Möglichkeit mehr an diesen Bereich ran zu kommen und man hätte ein Memleak geschaffen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

4

27.05.2006, 15:41

Hm, klingt gut. Würde das auch mit einfach Mitteln klappen, also zBsp.:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void* OwnMemReAlloc(void* pMemory, int iNewSize)
{
    int        iSize;
    void*    pNewMemory;

    // Bei negativer neuer Größe wird der Speicherbereich vergrößert.

    if(iNewSize < 0) iNewSize = iSize - iNewSize;

    // Neuen Speicherbereich reservieren

    pNewMemory = new(iNewSize);

    // Speicher hinüberkopieren und den alten Speicherbereich löschen

    memcpy(pNewMemory, pMemory, TB_MIN(iSize, iNewSize));
    delete pMemory;

    // Neuen Zeiger liefern

    return pNewMemory;
}

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

27.05.2006, 16:28

iSize hast du keinen Startwert zugewiesen, sber sonst dürfte das klappen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

27.05.2006, 16:52

Nein, das kann nicht klappen.

1. new(iNewSize) geht nicht
2. delete pMemory gibt nur 1 Byte frei

7

27.05.2006, 16:57

Hehe, die beiden Punkte sind schon klar, mich würde jetzt nur interessieren ob das Prinzip dahinter funktionieren würde ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

27.05.2006, 17:06

Nein. Denn wie willst du an die ursprüngliche Größe des Speicherbereichs kommen? In deinem Code weist du der Variablen iSize ja überhaupt keinen Wert zu, verwendest sie dann aber.

9

27.05.2006, 17:25

Okok, ich wollte lediglich wissen ob das Prinzip funktionieren würde. Völlig davon abgesehen ob jetzt Variablen initialisiert wurden oder irgend ne Schreibweise nicht stimmt.

Aber meinetwegen, machen wir's mal schnell etwas ordentlicher :wink:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int* OwnMemReAlloc(int* pMemory, int iNewSize, int iOldSize)
{
    int* pNewMemory;

    // Bei negativer neuer Größe wird der Speicherbereich vergrößert.

    if(iNewSize < 0) iNewSize = iSize - iNewSize;

    // Neuen Speicherbereich reservieren

    pNewMemory = new int[iNewSize];

    // Speicher hinüberkopieren und den alten Speicherbereich löschen

    memcpy(pNewMemory, pMemory, sizeof(int) * iOldSize);
    delete[] pMemory;

    // Neuen Zeiger liefern

    return pNewMemory;
}

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

27.05.2006, 17:32

Abgesehen davon, dass du besser char* statt int* verwenden würdest (es sei denn du willst deine Größe immer in als Vielfaches von 4 Bytes angeben): ja, warum nicht.

Werbeanzeige