Article View: be.comp.programming
Article #9556Re: Dynamische Array in C++
From: Luc Kumps
Date: Fri, 26 Apr 2002 07:00
Date: Fri, 26 Apr 2002 07:00
61 lines
3122 bytes
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-mailReferences:
<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