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

07.06.2009, 10:10

Memory Leak

Tach Leute,

als ich mein Programm laufen lies und im TaskManager merkte dass er immer mehr Speicher reservierte, habe ich versucht die Ursache dafür zu finden.
Ich habe die Fehlerquelle auf diese 4 Methoden zurückgeführt, da sie binnen kurzer Zeit sehr oft aufgerufen werden. Nur leider finde ich den Fehler nicht, könnt ihr mir helfen ?

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
int GetColor(int x, int y)
{
    COLORREF farbe;
    HDC desktop;
    desktop = GetDC(0) ;
    farbe = GetPixel(desktop, x , y);

    if (farbe != CLR_INVALID)
    return farbe;
    else    
    return -1;
}

int GetMouseX()
{
    int Zahl;
    LPPOINT point =  new POINT;
    if(GetCursorPos(point)!=0)
    {
        Zahl = point->x;
        delete point;
        point = NULL;
    }
    else
    {
        Zahl = -1;
    }
    return Zahl;
}
int GetMouseY()
{
    int Zahl;
    LPPOINT point =  new POINT;
    if(GetCursorPos(point)!=0)
    {
        Zahl = point->y;
        delete point;
        point = NULL;
    }
    else
    {
        Zahl = -1;
    }
    return Zahl;
}

bool isLoad(int x,int y,int color)
{
    if(GetColor(x,y)==color)
    {
        return true;
    }
    else
        return false;
}


lg

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

2

07.06.2009, 10:25

Bei GetMouseY und GetMouseX erstellst du in jedem Fall einen POINT, gibst aber nicht in jedem Fall den Speicher frei (der LPPOINT wird am Ende der Funktion sicher gelöscht, aber nicht der Speicher auf den er zeigt).

Vermutlich ist das das Leak.

3

07.06.2009, 10:43

Hallo,

gut, das habe ich geändert, der Leak bleibt trotzdem.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int GetMouseX()
{
    int Zahl;
    LPPOINT point =  new POINT;
    if(GetCursorPos(point)!=0)
    {
        Zahl = point->x;
    }
    else
    {
        Zahl = -1;
    }
    delete point;
    point = NULL;
    return Zahl;
}


Der Speicher der reserviert wurde erhöht sich in dieser Schleife :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
while(!isLoad(werte[0],werte[1],werte[2]) && !weiter)
        {
            if(isLoad(218,303,3095667))
            {
                Refresh();
                currentTime = 0;
            }
            if(currentTime > timeUntilRefresh)
            {
                weiter = true;
            }
            currentTime += 10;
            Sleep(10);
        }



C-/C++-Quelltext

1
2
3
4
void Refresh()
{
    VirtualKeyPress(0x74);
}


weiß net weiter :/

lg

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

4

07.06.2009, 11:15

wieso fraglich, ob

C-/C++-Quelltext

1
2
LPPOINT point =  new POINT;
if(GetCursorPos(point)!=0)

besser ist als

C-/C++-Quelltext

1
2
POINT point = {0};
if(GetCursorPos(&point)!=0)

aber das hat jetzt weniger was mit deinem problem zu tun

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

5

07.06.2009, 11:57

Jo und wenn BlackSnake schon mit Schönheitskorrekturen anfängt:

Warum lässt du GetCursorPos() nicht einfach einen LPPOINT zurückgeben und machst dann in GetMouseX() nur:

C-/C++-Quelltext

1
2
3
4
int GetMouseX()
{
     return GetCursorPos()->x;
}

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

6

07.06.2009, 12:31

Zitat von »"K-Bal"«

Jo und wenn BlackSnake schon mit Schönheitskorrekturen anfängt:

Warum lässt du GetCursorPos() nicht einfach einen LPPOINT zurückgeben und machst dann in GetMouseX() nur:

C-/C++-Quelltext

1
2
3
4
int GetMouseX()
{
     return GetCursorPos()->x;
}

Wenn GetCursorPos() einen LPPOINT, also einen Pointer, liefert, dann muss auf diesem auch früher oder später delete aufgerufen werden... So wie du das geschrieben hast, würde es aber nicht gehen. Müsste wenn dann schon so heißen:

C-/C++-Quelltext

1
2
3
4
5
6
7
int GetMouseX()
{
     LPPOINT lpp = GetCursorPos ();
     int x = lpp -> x;
     delete lpp;
     return x;
}
<< an dieser Stelle ist eine Signatur verstorben >>

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

7

07.06.2009, 13:07

Zitat von »"the[V«

oid"]
Wenn GetCursorPos() einen LPPOINT, also einen Pointer, liefert, dann muss auf diesem auch früher oder später delete aufgerufen werden... So wie du das geschrieben hast, würde es aber nicht gehen.
]


Ja die Speicherverwaltung habe ich mir da in GetCursorPos() gedacht ;) Außerdem muss der Zeiger ja nicht unbedingt auf den Heap zeigen. GetCursorPos() kann ja einer Klasse Input angehören, die ein Member CursorPos hat.

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

8

07.06.2009, 13:12

Hmm joo stimmt... da war ich was voreilig ^^ Allerdings würde ich dann eine Referenz statt eines Pointers zurückgeben. Pointer ist für mich immer ein Indiz dafür, dass der jenige, der da ein Objekt bekommt, auch den Besitz an diesem Objekt übernimmt, sprich, er ist dafür verantwortlich, es irgendwann zu löschen.
<< an dieser Stelle ist eine Signatur verstorben >>

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

07.06.2009, 13:22

Zitat von »"the[V«

oid"]Hmm joo stimmt... da war ich was voreilig ^^ Allerdings würde ich dann eine Referenz statt eines Pointers zurückgeben. Pointer ist für mich immer ein Indiz dafür, dass der jenige, der da ein Objekt bekommt, auch den Besitz an diesem Objekt übernimmt, sprich, er ist dafür verantwortlich, es irgendwann zu löschen.


GetCursorPosist eine Funktion der WinAPI und sofern nicht explizit etwas angegeben ist, dass man es selbst irgendwie beseitigen muss (à la COM Objekte), dann muss man das auch nicht. Und das gilt nicht nur bei der WinAPI, sondern überall, wo man einen Zeiger bekommt. Sofern nirgends geschrieben steht, dass man selbst für die Freigabe verantwortlich ist, ist man das auch nicht, da das ansonsten mehr Probleme gibt.

Natürlich ist es Unsinn da POINT per new zu erzeugen, wenn das Objekt sowieso nur bis an das Ende der Funktion lebt.

10

07.06.2009, 15:21

Tach,

GetCursorPos() ist eine WinAPI funktion.
Hab es jetzt so geändert, doch der Leak bleibt trotzdem:

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
int GetColor(int x, int y)
{
    COLORREF farbe;
    HDC desktop;
    desktop = GetDC(0) ;
    farbe = GetPixel(desktop, x , y);

    if (farbe != CLR_INVALID)
    return farbe;
    else    
    return -1;
}

int GetMouseX()
{
    int xCord = -1;
    LPPOINT point =  {0}; 
    if(GetCursorPos(point)!=0)
    {
        xCord = point->x;
    }
    delete point;
    point = NULL;
    return xCord;
}

int GetMouseY()
{
    int yCord = -1;
    LPPOINT point =  {0}; 
    if(GetCursorPos(point)!=0)
    {
        yCord = point->y;
    }
    delete point;
    point = NULL;
    return yCord;
}

bool isLoad(int x,int y,int color)
{
    if(GetColor(x,y)==color)
    {
        return true;
    }
    else
        return false;
}

Werbeanzeige