Avatar billede greybeard Nybegynder
19. maj 2002 - 00:47 Der er 4 kommentarer og
1 løsning

delete char* fra strcat()

Hvorfor kan man ikke delete et char*, der kommer fra strcat()?
Avatar billede erikjacobsen Ekspert
19. maj 2002 - 08:36 #1
Hmm, hvad mener du egentlig? Eksempel?
Avatar billede greybeard Nybegynder
19. maj 2002 - 11:56 #2
char* SendHandler::stringToChar(int padStart,String* in, int padEnd){
        if(in){
            int inl = in->Length;
            char* ts = new char[inl + 1 + padStart + padEnd];
            for (int i = 0; i < inl ; i++) {
                ts[i + padStart] = (char)in->get_Chars(i);
            }
            ts[i + padStart + padEnd] = 0;
            return ts;
        }else
            return NULL;
    }       
-------------------------------------------------------

                char* buffer1 = stringToChar(1,nick,1);
        if(buffer1){
            buffer1[strlen(buffer1) - 1] = b;
            buffer1[0] = a;
        }
        char* buffer2 = stringToChar(0,message,1);
        if (buffer1 && buffer2){
            buffer2[strlen(buffer2) - 1] = c;
            char* buffer = buffer1;
            strcat(buffer1,buffer2);
            //delete buffer2;
            cout << "MakeSendChar3: " << buffer1 << endl;
            sendPackage( buffer1);
            //delete buffer1;
        }else{
            if (buffer1)
                delete buffer1;
            if (buffer2)
                delete buffer2;
        }

Uden delete fungerer det fint.

Hvis jeg deleter buffer 1 får jeg en block error - hver gang

Hvis jeg deleter buffer2 får jeg det samme
, hvis buffer 2 er lang - buffer 1 er altid kort.

andet parameter i strcat er const, så det burde ikke ske
Avatar billede chries Nybegynder
19. maj 2002 - 13:22 #3
har en kommentar til strcat (går ud fra inl == længde uden nul terminering)

        char* ts = new char[inl + 1 + padStart + padEnd];
            for (int i = 0; i < inl ; i++) {
                ts[i + padStart] = (char)in->get_Chars(i);
            }
->          ts[i + padStart + padEnd] = 0;

sætter nulterminering sidst i det du har allokeret. inl = længde uden nul terminerting, så nulterminermineringen sidst vil blive anvendt.

strcat(buffer1,buffer2);

flytter buffer2 over i buffer 1 startende fra nulterminering (ligger sidst i buffer1). derfor vil der ikke være plads til buffer2.
Avatar billede greybeard Nybegynder
31. maj 2002 - 17:15 #4
chries -> beklager, jeg fik ingen mail om din kommentar. Derfor den sene reaktion.

Hvis jeg har en streng "test" og både padStart og padEnd == 1, så skulle jeg få en char*, der ser sådan ud:

'x','t','e','s','t','x',0 - 7 karakterer incl 0-terminering, hvor x er udefineret.

Jeg allokerer 7 bytes. De fire fra "test" + padStart + padEnd + 1, så det skulle være i orden.

Men selvfølgelig: da x ikke er defineret kan den jo være 0 - ups!.
Det er imidlertid ikke et problem jeg har haft - endnu. De resulterende strenge er korrekte. Mit problem opstår først, hvis jeg forsøger at delete dem.

Jeg var af den opfattelse at srtcat selv allokerer memory til resultatstrengen, og jeg har ikke fundet en præcis beskrivelse af hvordan den opfører sig.
Avatar billede greybeard Nybegynder
31. maj 2002 - 17:35 #5
strcat allokerer ikke memory
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester