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.04.2016, 16:34

Box2d - ContactListener - Zugriffsverletzung

Hallo,

ich habe ein Problem mit dem ContactListener in Box2d.
Sobald ich eine Kollision herbeirufe kriege ich einen Zugriffsverletzungsfehler.
Ich wundere mich da ich eigentlich nicht viel am Contactlistener bearbeitet habe.

die HPP:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
#include "Box2D\Box2D.h"

class CContactListener : public b2ContactListener
{

public:
    CContactListener() {};
    ~CContactListener() {};

    void BeginContact(b2Contact* contact) ;
    void EndContact(b2Contact* contact);

};


Die CPP:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#include "ContactListener.hpp"


void CContactListener::BeginContact(b2Contact * contact)
{
    printf("Kollision");
}

void CContactListener::EndContact(b2Contact * contact)
{
}


EDIT:
So übergebe ich den Contactlistener an Box2d:

C-/C++-Quelltext

1
2
3
World = new b2World(b2Vec2(0.f, 0.f));
    CContactListener ContactListener;
    World->SetContactListener(&ContactListener);


Der Fehler:
Ausgelöste Ausnahme: Lesezugriffsverletzung

'listener->' war '0xCCCCCCCC'.

Falls ein Handler für diese Ausnahme vorhanden ist, kann das Programm möglicherweise weiterhin sicher ausgeführt werden.

in der b2Contact.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
// Update the contact manifold and touching status.
// Note: do not assume the fixture AABBs are overlapping or are valid.
void b2Contact::Update(b2ContactListener* listener)
{
    //...

    if (wasTouching == false && touching == true && listener)
    {
        listener->BeginContact(this); // Hier soll der Fehler sein!
    }

    //...
}


Der Listener ist ja mein übergebenes Objekt... ich versteh nicht gnaz was ich falsch mache...


mit freundlichen Grüßen

Urprimat
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Urprimat« (27.04.2016, 17:12)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

27.04.2016, 20:03

C-/C++-Quelltext

1
2
3
World = new b2World(b2Vec2(0.f, 0.f));
    CContactListener ContactListener;
    World->SetContactListener(&ContactListener);

Das hier sieht sehr verdächtig aus.

ContactListener ist ein Objekt, dass nur im lokalen Scope lebt. World hingegen solange bis du es mit delete wieder freigibst. Ich vermute jetzt mal, dass das World Objekt auf das Objekt ContactListener zugreift nachdem ContactListener bereits zerstört wurde.

Falls dir das nicht hilft, zeig mal den ganzen Code rund um diese Stelle.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

3

27.04.2016, 20:04

Wo steht denn der Code der den Contact listener übergibt? Das lokal erzeugte Objekt wird zerstört sobald der scope verlassen wird. Dann zeigt der pointer auf ungültigen Speicher.

4

27.04.2016, 20:08

Tatsache...

Das war der Fehler :whistling:

vielen Dank!
Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

Linus Torvalds

5

27.04.2016, 20:11

Noch was: gönn dir std::uniqe_ptr.

Werbeanzeige