Toon posts:

[c++] geheugen probleem

Pagina: 1
Acties:
  • 43 views sinds 30-01-2008

Verwijderd

Topicstarter
Hallo,

Ik heb een probleem, waarschijnlijk kijk er gewoon overheen, maar ik heb me nu al lang genoeg doodgestaart en gezocht(google, MSDN etc). Het probleem is dat het programma 'klapt' als je de constante iAtrr veranderd naar 98(althans bij mij). Ik krijg een assert error (= _CrtCheckMemory() ). Ik snap 'm niet want ik leeg het geheugen toch iedere keer met delete. Weet iemand hoe ik dit probleem kan oplossen?

C++:
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
/*
Dit programma voert een werking 10 keer uit.
Deze bewerking is:
- dynamisch aanmaken van een string (alloceren v/h geheugen)
- 97 keer vullen van een string met 50 characters
- vrijmaken van het geheugen(delete)
*/

#include "stdafx.h"
#include <iostream.h>

int _tmain(int argc, _TCHAR* argv[])
{
    const int iTimes = 10;
    const int iAtrr = 97; // bij 98 of hoger klapt 't proggie
    const int iLenght = 50;

    for(int x = 1; x<= iTimes; x++){    

        for(int i = 1; i <= iAtrr; i++) {       // Aantal 
            char *pTemp = new char[iLenght];
            
            strcpy(pTemp,"1234567890");
            int j = 1;
            do {
                strcat(pTemp,"1234567890");
                j++;
            }while(j<=4);

            pTemp = NULL;
            delete[] pTemp;
        }
        cout << x << " times [done]\n";
    }

    return 0;
}

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 29-05 00:16
sowieso lijkt het me dat iLength 51 moet zijn.

Verwijderd

Topicstarter
Jep dat is het probleem, harstikke bedankt. Ik zocht gewoon helemaal verkeert. 8)7

C++:
1
char *pTemp = new char[iLenght +1]; 

  • toraq
  • Registratie: September 2000
  • Niet online

toraq

Shoving is the answer

Euhm, zal je je pointer niet eerst deleten en dan op NULL zetten? :)

I am a shover robot, do not trust the pusher robot, I will protect you from the terrible secrets of space!


  • whoami
  • Registratie: December 2000
  • Laatst online: 08-07 15:38
toraq schreef op 15 januari 2003 @ 13:07:
Euhm, zal je je pointer niet eerst deleten en dan op NULL zetten? :)


Alleen deleten is ook al goed.

https://fgheysels.github.io/


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Mjah, maar in dit geval zit je dus een poging te wagen NULL (0) te deleten. Je bent je pointeradress kwijt en hebt dus een leak

  • toraq
  • Registratie: September 2000
  • Niet online

toraq

Shoving is the answer

W2k schreef op 15 January 2003 @ 13:13:

[...]


Alleen deleten is ook al goed.
Inderdaad, maar je moet hem natuurlijk niet eerst op NULL zetten.

I am a shover robot, do not trust the pusher robot, I will protect you from the terrible secrets of space!


  • whoami
  • Registratie: December 2000
  • Laatst online: 08-07 15:38
G2k schreef op 15 January 2003 @ 13:33:
Mjah, maar in dit geval zit je dus een poging te wagen NULL (0) te deleten. Je bent je pointeradress kwijt en hebt dus een leak


Ik heb dan ook niet gezegd dat je hem eerst op NULL Moet zetten he. :+

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ja nu heb ik bovenstaand probleem opgelost. Maar nu een bijkomend probleem. Ik ben een proggie aan 't schrijven. En op een bepaald moment in het proggie is er de mogelijkheid om een "select all" checkbox aan te klikken. Vervolgens worden alle items in een multi-listbox geselecteerd. Alle geselecteerde items worden naar een dropdown box gestuurd. Echter als ik ff flink een paar keer op het "select all" knopje druk (stuk of 50 keer) Dan krijg ik dezelfe error als in het eerste programma (= _CrtCheckMemory() ). Hier onder een fragment uit mijn code. Ik hoop dat jullie een oplossing weten....


C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Go through the list backwards because after 
// deleting an item the indices change for 
// every subsequent item. By going backward, 
// the indices are never invalidated.
for (int i = iBufferSize - 1; i >= 0; i--) 
{ 
    iStrLen = (int)SendDlgItemMessage(hDlg, ATTRIBUTE_LIST, LB_GETTEXTLEN, aBuff[i], NULL);
    char *sItem = new char[iStrLen+1];
    SendDlgItemMessage(hDlg, ATTRIBUTE_LIST, LB_GETTEXT, aBuff[i], (LPARAM) sItem);

    if(SendDlgItemMessage(hDlg, IDC_SORTBY, CB_FINDSTRINGEXACT,-1,(LPARAM)(LPCSTR)sItem) == CB_ERR) {
        SendDlgItemMessage(hDlg, IDC_SORTBY, CB_INSERTSTRING,-1, (LPARAM)(LPCSTR)sItem);
        //sItem = NULL;
    }

    delete[] sItem;

}                           

[ Voor 4% gewijzigd door Verwijderd op 15-01-2003 13:52 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 08-07 15:38
Volgens mij bega je hier weer dezelfde fout. Je delete sItem, maar die sItem kan NULL zijn.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik heb nu regel 13 uitgezet, maar dan krijg ik dezelfde fout !

  • whoami
  • Registratie: December 2000
  • Laatst online: 08-07 15:38
Heb je dat stuk code al eens gedebugged?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Jep, hij blijft op regel 8 hangen!! Alleen hoe kan dit als ik toch weer iedere keer het geheugen vrij geef?! De heap kan onmogelijk vol raken. Waaschijnlijk is het iets heel kleins, maar ik staar er waarschijnlijk overheen.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik vraag me af of je wel iedere keer geheugen vrijgeeft, aangezien je je pointers altijd op NULL lijkt te zetten voor je ze delete ;)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
ja zoals je ziet heb ik die regel uitgezet(regel 13). Dus dan is dat zowiezo het probleem niet. Maar wat dan wel?

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
doe een try catch misschien doen die sendMessages iets fouts...

ik zou ook nooit een loop met daarin constant new/delete doen (alhoewel ie zou moeten werken) kan die iStrLen+1 toevallig geen foute value geven?

en misschien (heb nu echt geen tijd om te checken) mag je het geheugen niet vrijgeven omdat die setDialogItem misschien die strdata niet copiert maar letterlijk de pointer gebruikt...

Verwijderd

Topicstarter
* iStrLen heeft altijd een waarde(heb dat in de debugger getest).
* Ook setDialogItem geeft een juiste waarde terug.

En ik denk ook inderdaad dat setDialogItem direct naar de pionter copierd. Iets anders kan ik echt niet verzinnen. Nog ideeen hoe ik dit kan oplossen?

  • AaroN
  • Registratie: Februari 2001
  • Laatst online: 16-08-2023

AaroN

JayGTeam (213177)

offtopic:
Ik zie C++ staan, waarom gebruik je dan eigenlijk char pointers i.p.v. strings ;) En tevens kun je ipv van te casten dmv '(int)' beter 'static_cast<int>' gebruiken.


Is het sowieso niet handiger om gewoon een locale variabele te gebruiken in plaats van een op de free store? Probeer die new en delete operators gewoon eens weg te laten, moet goed gaan dan, imho :P

[ Voor 5% gewijzigd door AaroN op 15-01-2003 15:20 ]

JayGTeam (213177)


Verwijderd

Topicstarter
jep dat gaat uiteraard goed. Maar dan moet ik een vaste "char" defineren. En dat wil ik dus juist niet. Hij moet variabel zijn.

  • AaroN
  • Registratie: Februari 2001
  • Laatst online: 16-08-2023

AaroN

JayGTeam (213177)

je hebt helemaal gelijk |:(
Wordt natuurlijk een const char*

JayGTeam (213177)


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, deadman bedoelt dat de lengte van de array dan tijdens compiletime bekend moet zijn. Maar AaroN heeft wel gelijk, waarom gebruik je geen strings? Dan ben je in 1 klap van al je gezeik af

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Verwijderd schreef op 15 January 2003 @ 15:22:
jep dat gaat uiteraard goed. Maar dan moet ik een vaste "char" defineren. En dat wil ik dus juist niet. Hij moet variabel zijn.

Gebruik dan ook een std::string. Memorymanagement moet je gewoon niet doen als je de gevolgen niet kan overzien :)

Verwijderd

Topicstarter
Maar ik wil gewoon wel weten HOE ik het moet doen en HOE het werkt. Een functie aanroepen die het VOOR je doet is lekker makkelijk, maar dan weet je nog niet hoe het achter de schermen werkt.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23:29
Volgens de docs kan SendDlgItemMsg ook LB_ERR teruggeven.

LB_ERR = -1
-1 + 1 = 0

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Ja dat wist ik al, ik krijg geen error terug, omdat het op deze regel al fout gaat

C++:
1
char *sItem = new char[iStrLen+1];

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hoeveel geheugen verbruikt je app? (kun je zien in de task manager)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Quorton
  • Registratie: Januari 2001
  • Laatst online: 31-05 14:12
wat is aBuff[i] precies en waarom wil je de lengtes bewaren terwijl je de strings toch weggooid ?

Quadcore 6600 @ 3,3Ghz, 4 GB, 2 TB raid 5, GF 8400GS
P4 2.8G, 2 GB, 500GB diskspace, GF FX5200


Verwijderd

Topicstarter
.oisyn schreef op 15 January 2003 @ 16:33:
Hoeveel geheugen verbruikt je app? (kun je zien in de task manager)
6.284 kb verbruikt ie

Verwijderd

Topicstarter
Kan het misschien zijn dat de buffer van setDialogItem (zoals hobbit_be suggereerde) misschien volloopt ? Zoja hoe kan ik deze dan legen?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23:29
Verwijderd schreef op 15 januari 2003 @ 16:30:
Ja dat wist ik al, ik krijg geen error terug, omdat het op deze regel al fout gaat

C++:
1
char *sItem = new char[iStrLen+1];
Maar je doet daarvoor al een SendDlgItemMessage waarvan je de return value niet checked, en waaruit iStrLen wordt bepaald.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
iStrLen gaat altijd goed dat heb ik al helemaal gechecked! Jongens is hier nu niemand die een normaal antwoord kan geven op de vraag?

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Verwijderd schreef op 15 januari 2003 @ 22:18:
iStrLen gaat altijd goed dat heb ik al helemaal gechecked! Jongens is hier nu niemand die een normaal antwoord kan geven op de vraag?

1) Leer jij eerst maar eens normaal reageren
2) We zijn je helpdesk niet.

Mensen proberen in hun vrije tijd jouw probleem op te lossen en dan ga je zo beginnen? Bekijk het ff :(
Pagina: 1

Dit topic is gesloten.