webForumDet fria alternativet

Problem med operatorn delete

2 svar · 317 visningar · startad av forum

forumMedlem sedan apr. 2003100 inlägg
#1
AnsiString __fastcall THDAMainForm::HDAMainFormGetCurrentDate()
{
        AnsiString YearMonthDay;
        YearMonthDay = TDateTime::CurrentDateTime().DateString();

        char* NewDate = new char[9];
        NewDate = YearMonthDay.c_str();
        char* RealDate = new char[7];

        RealDate[0] = NewDate[0];
        RealDate[1] = NewDate[1];
        RealDate[2] = NewDate[2];
        RealDate[3] = NewDate[3];
        RealDate[4] = NewDate[5];
        RealDate[5] = NewDate[6];
        RealDate[6] = NewDate[8];
        RealDate[7] = NewDate[9];

        AnsiString StringToReturn = (AnsiString)RealDate;

        delete []RealDate;
        delete []NewDate;        
        return StringToReturn;
}

När jag kör denna kod som den ser ut ovan, så går den igen kompileringen. Men när jag sedan trycker på knappen som exekverar koden. Får jag ett exception som säger:

'EAccessViolation at adress 3260995A in module 'CC3260MT.DLL'. Write of address 30303208'

Provade med att flytta 'delete' raderna under return raden:

return StringToReturn;
delete []RealDate;
delete []Newdate;

Då går den igenom kompilering, och programmet fungerar utan någon exception. Men får 2 kompilator varningar som säger 'Unreacheble Code' och 'Function should return a value'

Är det bara kompilatorn som spökar, eller talar den sanning? Hur ska jag göra isåfall för att få bort varningarna? Någon som vet?
Jag änvänder Borland C++ builder 6

PhorpherMedlem sedan feb. 20002 300 inlägg
#2

Du allokerar minne för 9 chars i NewDate och 7 chars i RealDate. Alla index börjar på 0, således är maxindex för NewDate och RealDate 6 respektive 8.

Om det är delete som krånglar och du stoppar dem under return-satsen så är det inte så konstigt att det fungerar och du får "unreachable code". Return-satsen kommer ju att exekvera före delete-satserna och funktionen returnerar innan de får chans att exekvera.

PeWMedlem sedan juni 200010 432 inlägg
#3

Tilläggas kan även att tilldelning eller liknande utanför en arrays intervall kan ibland fungera och ibland gå åt skogen. Det finns ingen inbyggd säkerhet i standardspråket (C eller C++) för att se till att primitiver (int, char) hanteras på rätt sätt utan det lämnas till programmeraren att hålla koll.

128 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)