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

20.07.2015, 17:25

[C++] Problem mit Pointer "_BLOCK_TYPE_IS_VALID"

Hallo Leute,
ich arbeite momentan an einem Spiel und habe ein Problem mit einem Zeiger.


Aus Klasse A wird die Adresse von Foo dem Zeiger Foo aus Klasse B übergeben und
die Adresse von Foo aus Klasse B wird dem Zeiger Foo aus Klasse C übergeben... :wacko:
Problem:
Wenn ich probiere diese Zeiger ordnungsgemäß zu löschen, erscheint asserion-Fehler:

Debug assertion failed!

[...]

_block_type_is_valid(phead- nblockuse)
Im Internet habe ich bereits gelesen, dass der Fehler bedeutet, das ich etwas doppelt lösche.

Doch ich komme nicht darauf, wo ich diesen Fehler verursache. :dash:


Minimalbeispiel:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>

using namespace std;

class C
{
private:
    int *Foo;
public:
    C(int *passed_Foo)
    {
        Foo = passed_Foo;

        *Foo = 12;
    }
    ~C()
    {
        cout << "Destructor C" << endl;
        delete Foo;
    }
};

class B
{
private:
    int *Foo;
    C *C_Foo;
public:
    B(int *passed_Foo)
    {
        Foo = passed_Foo;

        C_Foo = new C(Foo);
        cout << *Foo << endl;
    }
    ~B()
    {
        cout << "Destructor B" << endl;
        delete Foo;
        delete C_Foo;
    }
};

class A
{
private:
    int Foo;
    B *B_Foo;

public:
    A()
    {
        Foo = 1;
        B_Foo = new B(&Foo);
    }
    ~A()
    {
        delete B_Foo;
    }
};

int main()
{
    A *A_Foo = new A ();

    delete A_Foo;
    

    system("PAUSE");
    return 0;
}


P.S.:
Ich bin noch Anfänger, was Pointer/Zeiger betrifft. Also kann es sein, dass mein Problem total absurd und
simpel ist.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Tucker« (20.07.2015, 21:30)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

20.07.2015, 17:31

Du versuchst vermutlich, ein Objekt zweimal zu deleten... ;)

3

20.07.2015, 17:39

Das weiß ich bereits, aber wo mache ich das? ?(

4

20.07.2015, 17:39

Du darfst jedes Objekt nur einmal löschen, und auch nur, wenn du den Speicher mit new angelegt hast. Dein Code versucht zweimal den Speicher einer Variablen auf dem Stack zu löschen.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

5

20.07.2015, 17:47

Richtig (obwohl, die int variable wird im objekt nicht auf dem stack, sondern heap erstellt), du kannst mit new erzeugten freien speicher, (und nur damit) nur einmal mit delete freigeben.

6

20.07.2015, 18:25

In Ordnung, vielen Dank für die schnellen Antworten!

Werbeanzeige