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

23.11.2015, 09:36

nutzen von delete an einem Objekt verursacht crash

Hey,
Hab das problem sobalt ich ein Objekt mit delete lösche, crasht meine exe.
hier ist der code

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
     // Mein.cpp
    sf::RenderWindow            *pMainWindow;
    sf::Event                   *pMainEvent;

    pMainWindow                 = new sf::RenderWindow(sf::VideoMode(1280, 720), "Test", sf::Style::Default);
    pMainEvent                  = new sf::Event;

    Test *pTest;
    pTest   = new Test;


    while(pMainWindow->isOpen())
    {
        while(pMainWindow->pollEvent(*pMainEvent))
        {
            if(sf::Keyboard::isKeyPressed(sf::Keyboard::F))
            {
                delete pTest;
                Sleep(200);
            }
        }

        pMainWindow->clear(sf::Color::White);
        pTest->render(pMainWindow);
        pMainWindow->display();
    }


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Test.cpp
#include <iostream>
#include <windows.h>
#include <SFML/Graphics.hpp>
#include "Test.h"

using namespace std;

Test::Test()
{
    pSprite     = new sf::Sprite;
    pTexture    = new sf::Texture;
    pTexture->loadFromFile("Images/button.png");
    pSprite->setTexture(*pTexture);
}

Test::~Test()
{
    delete pSprite;
    cout << "destructor" << endl;
}

2

23.11.2015, 09:41

eigentlich nicht, ich drücke nur 1x 'F' und die sleep()funktion verhindert dann ja das ichs mehrmals aufrufe

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

23.11.2015, 09:47

Was sagt der Debugger? Bei welchem delete crashed es mit genau welcher Fehlermeldung? Abgesehen davon: Wieso genau verwendest du hier überhaupt erst new?

4

23.11.2015, 09:54

nehme an du meinst mit debugger diesen build log:

Zitat

-------------- Run: Debug in Hauptmenu_test (compiler: GNU GCC Compiler)---------------

Checking for existence: C:\Users\eronor\Desktop\C++\C++ Projekte\Segmente\Hauptmenu_test\bin\Debug\Hauptmenu_test.exe
Executing: "C:\Program Files (x86)\CodeBlocks/cb_console_runner.exe" "C:\Users\eronor\Desktop\C++\C++ Projekte\Segmente\Hauptmenu_test\bin\Debug\Hauptmenu_test.exe" (in C:\Users\eronor\Desktop\C++\C++ Projekte\Segmente\Hauptmenu_test\.)


es crasht wenn ich das Objekt lösche wie oben schon steht
also delete pTest

ich erstelle das Objekt mit new und übergib es an einem zeiger desselben typs (also der klasse) damit ich es später wieder löschen kann.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

23.11.2015, 09:56

Nein, mit Debugger meinte ich den Debugger...

Wie genau "crashed" es?

6

23.11.2015, 09:58

hab ich auch bereits getan um mir da sicher zu sein.
Aber hier es gibt nur einmal die zahl: 1 aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    long var = 0;

    while(pMainWindow->isOpen())
    {
        while(pMainWindow->pollEvent(*pMainEvent))
        {
            if(sf::Keyboard::isKeyPressed(sf::Keyboard::F))
            {
                var++;
                cout << var << endl;
                delete pTest;
                Sleep(200);
            }
        }

        pMainWindow->clear(sf::Color::White);
        pTest->render(pMainWindow);
        pMainWindow->display();
    }

7

23.11.2015, 10:09

denke dann brauchst du wohl das?
Hab mir eben nen tut angeschaut, bisher kp wie man debugger nutzt.
click

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

23.11.2015, 10:10

Um, wieso steht das delete da in der inneren Schleife? Was genau soll das Sleep da erreichen?

9

23.11.2015, 10:13

Einfach nur damit ich es mit einer Taste aufrufen kann.
Sleep soll das programm 200ms anhalten damit es nicht mehrmals aufgerufen wird, weil die schleife sehr schnell wieder aufgerufen wird.
könnte das delete auch direkt nach new machen und es crasht weiterhin.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

23.11.2015, 10:14

Ja, Sleep hält das Programm für 200 ms an, aber dann läuft es weiter, wobei pTest nicht mehr existiert...

Werbeanzeige