🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #9556

Re: Dynamische Array in C++

#9556
From: Luc Kumps
Date: Fri, 26 Apr 2002 07:00
61 lines
3122 bytes
Het probleem ligt aan het statement
_LangeString = new char[1];

Je voorziet slechts plaats voor 1 enkel character. Dit werkt zolang de
string leeg is, want dan heb je enkel een terminating 0 nodig. Wanneer je
echter woordjes begint toe te voegen, dan zal 'strcat' geheugen voorbij deze
ene byte beginnen kapot te schrijven. Daardoor raakt je heap corrupt. Visual
C++ detecteert dit tijdens runtime. De "DAMAGE" waarvan sprake legt uit dat
je heap corrupt is, omdat een geheugenblok beginnend op adres 0x300040 aan
het einde overschreven werd. Als je de waarde van de pointer _LangeString
bekijkt, dan zul je zien dat deze gelijk is aan 0x300040!

Het feit dat het toevallig werkt met andere compilers wil niet zeggen dat
het programma correct is. Indien je deze code zou inlassen in een groter
programma, dan zou dat programma naar alle waarschijnlijkheid om mysterieuze
redenen de mist ingaan op het meest onverwachte ogenblik (althans als we
Murphy mogen geloven)...

Als je de structuur van het programma ongewijzigd wenst te laten, en je wilt
dat de array automatisch groeit, dan zul je de methode setString moeten
aanpassen. Je zult daar een nieuwe array moeten alloceren, bv met

_lengte = strlen(string);

// Nieuwe lengte=oude string+nieuwe string+0 character

int newLength=_lengte+strlen(_LangeString)+1;

if (_LangeString[0]!=0)

newLength++; // reserveer ook plaats voor de spatie als niet eerste woord

char *tmpArray = new char [newLength+1];

strcpy(tmpArray, _LangeString);

if (_LangeString[0]!=0)

strcat(tmpArray, " ");

strcat(tmpArray, string);

if (_LangeString[0]==0)

tmpArray[0] = toupper(tmpArray[0]);

delete[] _LangeString;

_LangeString = tmpArray;

return;



Iets gelijkaardigs moet gebeuren in getLangeString(), want daar wordt ook
een character toegevoegd. Als je dit gedoe wenst te vermijden, dan is het
raadzaam om de class std::string te gebruiken, die achter de schermen al
deze (de)allocaties volledig automatisch uitvoert, inclusief een ganse boel
optimalisaties!

Luc K
Technical Details
Message-ID: <DW6y8.40286$Ze.6808@afrodite.telenet-ops.be>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-03!supernews.com!nntp.cs.ubc.ca!fu-berlin.de!newsfeeds.belnet.be!news.belnet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail
References: <B8EE1A81.2010%christof_laeremans@hotmail.com>

Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit
X-Google-Thread: fcea4,d8a342a4bf67824a
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2002-04-26 00:02:02 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-03!supernews.com!nntp.cs.ubc.ca!fu-berlin.de!newsfeeds.belnet.be!news.belnet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail
From: "Luc Kumps" <NOkumpsSPAM@pandora.be>
Newsgroups: be.comp.programming
References: <B8EE1A81.2010%christof_laeremans@hotmail.com>
Subject: Re: Dynamische Array in C++
Lines: 66
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2600.0000
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000
Message-ID: <DW6y8.40286$Ze.6808@afrodite.telenet-ops.be>
Date: Fri, 26 Apr 2002 07:00:51 GMT
NNTP-Posting-Host: 213.118.65.18
X-Complaints-To: abuse@telenet.be
X-Trace: afrodite.telenet-ops.be 1019804451 213.118.65.18 (Fri, 26 Apr 2002 09:00:51 MET DST)
NNTP-Posting-Date: Fri, 26 Apr 2002 09:00:51 MET DST
Organization: Telenet Internet