[C++] String laat geheugen achter? (mtrace)

Pagina: 1
Acties:

  • Remenic
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:06
Ik heb het volgende stukkie code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
#include <mcheck.h>

int main()
{
    mtrace();

    string OS = "GNU/Linux";

    std::cout << OS << endl;
}

Als ik nu mtrace uitvoer op het gegenereerde bestand, dan zie ik:
code:
1
2
3
4
5
6
remenic@sidney:~/projects/mcheck> mtrace m2.mt

Memory not freed:
-----------------
   Address     Size     Caller
0x0804c2f8    0x500  at 0x8049e70

Het maakt niet uit of ik van OS een pointer naar een string maak, en netjes delete als ik er klaar mee ben, of 'em declareer zoals hier boven. In bijde gevallen beweerd mtrace dat er 500(K)B (zijn 't KBytes, of Bytes?) niet vrijgegeven wordt.

Is dit een probleem met mtrace, of met de string class?

Het betreft Linux 2.4.16 met glibc 2.2.4 en gcc 2.95.3.

Verwijderd

Ben geen expert ofzo maar ik heb geleerd dat je achter je bibliotheek een '.h' moet typen:

<iostream.h>

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:04

Creepy

Tactical Espionage Splatterer

het probleem zou em ook wel eens in de gebruikt includes kunnen zitten..

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Remenic
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:06
Op woensdag 12 december 2001 15:41 schreef Kingetjuh het volgende:
Ben geen expert ofzo maar ik heb geleerd dat je achter je bibliotheek een '.h' moet typen:

<iostream.h>
In het geval van iostream zal dat idd goed gaan, maar string.h en string zijn twee HELE andere bibliotheken.

In C++ eindigen de header files niet altijd met .h. Maar das ook niet altijd zo geweest geloof ik.

  • Knoetje
  • Registratie: Februari 2001
  • Laatst online: 16-01 13:39
Was toch iets met malloc ???

Alles is najagen van wind...


  • Remenic
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:06
Op woensdag 12 december 2001 15:43 schreef Creepy het volgende:
het probleem zou em ook wel eens in de gebruikt includes kunnen zitten..
als ik <string> include maar verder niet gebruik, dan zijn er geen problemen. 't Gaat echter fout zodra ik een object aanmaak van het type string.

  • Remenic
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:06
Let wel, dit lijkt alleen te gebeuren met de string class.

Als ik een char, int*, of zelfs een zelf bedachtte class gebruik, dan werkt 't prima.

  • farlane
  • Registratie: Maart 2000
  • Nu online
En als je een constante string ("Farlane is lief" bijvoorbeeld ;) ) cout?

Ik weet niet hoe mtrace werkt, maar bij gebruik van cout worden wel allerlei statische objecten aangemaakt.

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.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
En als je een string in een loopje zet? Wordt de memory leak dan ook ix groter?

  • The End
  • Registratie: Maart 2000
  • Laatst online: 11:56

The End

!Beginning

Je hebt grote kans dat de memoryleak niet bestaat, maar voor mtrace wel lijkt te bestaan... Als de memory checking routines te vroeg worden aangeroepen, dan lijkt het of er een leak is terwijl die er niet is.
Ik heb dit wel eens gehad in Visual studio met een paar libraries.
Ik zou zeggen: Run het 100000x in een lus en kijk of je prog steeds groter wordt, zoniet dan is het mtrace.

  • igmar
  • Registratie: April 2000
  • Laatst online: 09-09 19:53

igmar

ISO20022

#include <mcheck.h>

int main()
{
mtrace();

string OS = "GNU/Linux";

std::cout << OS << endl;
}[/code]
Als ik nu mtrace uitvoer op het gegenereerde bestand, dan zie ik:
code:
1
2
3
4
5
6
remenic@sidney:~/projects/mcheck> mtrace m2.mt

Memory not freed:
-----------------
   Address     Size     Caller
0x0804c2f8    0x500  at 0x8049e70

Het maakt niet uit of ik van OS een pointer naar een string maak, en netjes delete als ik er klaar mee ben, of 'em declareer zoals hier boven. In bijde gevallen beweerd mtrace dat er 500(K)B (zijn 't KBytes, of Bytes?) niet vrijgegeven wordt.
Neem een andere debug lib. Dat ding snapt geen objects zo te zien. De class OS staat gewoon op de stack, niks mis mee.

  • Remenic
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:06
Op woensdag 12 december 2001 16:58 schreef igmar het volgende:

[..]

Neem een andere debug lib. Dat ding snapt geen objects zo te zien. De class OS staat gewoon op de stack, niks mis mee.
Hier ben ik het niet mee eens, want een zelf gemaakte class werkt wel prima.

  • Remenic
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:06
Op woensdag 12 december 2001 16:12 schreef Orphix het volgende:
En als je een string in een loopje zet? Wordt de memory leak dan ook ix groter?
Zal ik morgen even testen.


Maar ik denk dat het idd onschuldig is.

  • Remenic
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:06
Ik heb net even een loopje gemaakt van 0 tot 10000 (bij 10000000 raakte me HDD vol :o), en de memory leak is er niet groter op geworden.

Ik denk dus dat dit een stuk "geshared" geheugen is ofzo, waar de string class gebruik van maakt.

Hoe dan ook, tis "onschuldig" 8-)

  • The End
  • Registratie: Maart 2000
  • Laatst online: 11:56

The End

!Beginning

Op donderdag 13 december 2001 08:31 schreef Remenic het volgende:
Ik heb net even een loopje gemaakt van 0 tot 10000 (bij 10000000 raakte me HDD vol :o), en de memory leak is er niet groter op geworden.

Ik denk dus dat dit een stuk "geshared" geheugen is ofzo, waar de string class gebruik van maakt.

Hoe dan ook, tis "onschuldig" 8-)
Is volgens mtrace niet groter geworden?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op woensdag 12 december 2001 15:08 schreef Remenic het volgende:
Ik heb het volgende stukkie code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
#include <mcheck.h>

int main()
{
    mtrace();

    string OS = "GNU/Linux";

    std::cout << OS << endl;
}

Als ik nu mtrace uitvoer op het gegenereerde bestand, dan zie ik:
code:
1
2
3
4
5
6
remenic@sidney:~/projects/mcheck> mtrace m2.mt

Memory not freed:
-----------------
   Address     Size     Caller
0x0804c2f8    0x500  at 0x8049e70

Het maakt niet uit of ik van OS een pointer naar een string maak, en netjes delete als ik er klaar mee ben, of 'em declareer zoals hier boven. In bijde gevallen beweerd mtrace dat er 500(K)B (zijn 't KBytes, of Bytes?) niet vrijgegeven wordt.

Is dit een probleem met mtrace, of met de string class?

Het betreft Linux 2.4.16 met glibc 2.2.4 en gcc 2.95.3.
Vrijwel zeker mtrace.

string ofwel std::string werkt met zogenaamde allocators. Een allocator vraagt een groot geheugenblok (aan malloc of new) en verdeelt dat in kleine stukjes voor string (en vector en...) . Het lijkt erop dat mtrace niet doorheeft dat de allocator 0x500 (1280 decimaal) bytes beheert.
Dit is een vrij gangbaar probleem met memory leak detectors.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • drZymo
  • Registratie: Augustus 2000
  • Laatst online: 09-08 22:22
Uhm string is een class toch? Als je daar nou eens free() op doet zodat het geheugen zelf wordt vrijgegeven ipv door de compiler. Dan zou het mischien opgelost kunnen zijn. :?

Correct me if i'm wrong. :P

Ennu
Op woensdag 12 december 2001 15:46 schreef KNOETJE het volgende:
Was toch iets met malloc ???
Leuk dat je wilt helpen maar hier hebben we nix aan natuurlijk :P

"There are three stages in scientific discovery: first, people deny that it is true; then they deny that it is important; finally they credit the wrong person."


  • Remenic
  • Registratie: Juni 2001
  • Laatst online: 09-08 20:06
Op donderdag 13 december 2001 13:47 schreef drZymo het volgende:
Uhm string is een class toch? Als je daar nou eens free() op doet zodat het geheugen zelf wordt vrijgegeven ipv door de compiler. Dan zou het mischien opgelost kunnen zijn. :?

Correct me if i'm wrong. :P

Ennu
[..]

Leuk dat je wilt helpen maar hier hebben we nix aan natuurlijk :P
Zoals ik al vermeld had, als ik 'm zelf free() of delete (c++), dan zegt mtrace hetzelfde.

  • drZymo
  • Registratie: Augustus 2000
  • Laatst online: 09-08 22:22
Op donderdag 13 december 2001 15:54 schreef Remenic het volgende:

[..]

Zoals ik al vermeld had, als ik 'm zelf free() of delete (c++), dan zegt mtrace hetzelfde.
oops :O beter lezen |:(

Denk dan maar zoals de meeste software bedrijven denken: "Wat is nou 500 bytes :P, we hebben 128 MB gemiddeld in een systeem."

:P

"There are three stages in scientific discovery: first, people deny that it is true; then they deny that it is important; finally they credit the wrong person."


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Op donderdag 13 december 2001 13:28 schreef MSalters het volgende:

[..]

Vrijwel zeker mtrace.

string ofwel std::string werkt met zogenaamde allocators. Een allocator vraagt een groot geheugenblok (aan malloc of new) en verdeelt dat in kleine stukjes voor string (en vector en...) . Het lijkt erop dat mtrace niet doorheeft dat de allocator 0x500 (1280 decimaal) bytes beheert.
Dit is een vrij gangbaar probleem met memory leak detectors.
Het zou ook (of waarschijnlijk is) iostream kunnen zijn. Die kan buffers aanmaken.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op donderdag 13 december 2001 17:21 schreef OlafvdSpek het volgende:

[..]

Het zou ook (of waarschijnlijk is) iostream kunnen zijn. Die kan buffers aanmaken.
Nee - de OP schreef dat het alleen met string gebeurde, en niet met int. Dat maakt voor de iostream class niet uit, die gebruikt daarvoor dezelfde buffer (std::cout.rdbuf())

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1