Avatar billede veng Nybegynder
05. november 2010 - 17:53 Der er 10 kommentarer og
1 løsning

Hjælp til mem-leak i operator+ i "hjemmelavet" string class (Char*)

Hej Eksperter

Jeg arbejder på en string(Str) class, som indeholder char array og en int size(er bare for at øve mig på c++).  Jeg har fået skrevet functioner til nogle af opperatorerne som ==, !=, += og =.
Mit problem er +operator da jeg ikke lige kan gennemskue hvordan den kommer til at virke ordentligt.

Jeg har faktisk fået lavet en + som virker men så leaker mit program hvilket jo er ret skidt.
Jeg linker lige til min .h fil så er det nok lidt nemmere at hjælpe.
http://dl.dropbox.com/u/3698434/Str.h

Sådan ser min function ud end til videre for at få noget der "virker".

Str& Str::operator+(const Str &other)
{
    Str* result = new Str();
    result = this;
    *result += other;
    return *result;         
}
Det jeg egentligt gerne ville have er noget i retning af

Str Str::operator+(const Str &other)
{
    Str result = *this;
    result += other;
    return result;
}
Men her er det somom min destructor fjerne array data inden den returnere hvilket sux :D.

Er der nogen der kan hjælpe med dette :D?

/Veng
Avatar billede arne_v Ekspert
05. november 2010 - 17:58 #1
Har du copy constructor og assignment operator defineret for klassen?

Hvis ikke så kan det forårsage alle mulige slags problemer.

Hvordan er += operator defineret?
Avatar billede veng Nybegynder
05. november 2010 - 18:13 #2
Min += ser sådan ud

Str& Str::operator+=(const Str& other)
{
    const size_t gnu = this->size+other.size+1;
    char *temp = new char[gnu];
   
    for(unsigned int i=0; i<this->size;i++)
    {
        //std::cout << i << "\n";
        temp[i] = this->data[i];
    }
    for(unsigned int i=size; i<this->size+other.size;i++)
    {
        //std::cout << i << "\n";
        temp[i] = other.data[i-size];
    }
    temp[gnu-1]='\0';

    free(this->data);
    this->data = temp;
    this->size = gnu-1;
    return *this;
}

Er copy constructor det samme som operator=? for så ja
Avatar billede arne_v Ekspert
05. november 2010 - 18:17 #3
Nej.

X::X(const class X& v)
void X::operator=(const class X& v)
Avatar billede veng Nybegynder
05. november 2010 - 18:23 #4
Ok, jeg prøver at få skrevet en copy constructor så :D
Avatar billede arne_v Ekspert
05. november 2010 - 18:49 #5
Den her:

Str result = *this;

mener jeg nemlig kalder copy constructor og ikke assignment operator.
Avatar billede veng Nybegynder
05. november 2010 - 18:51 #6
Så siger jeg da tak og du må godt smide et svar, var den copy constructer jeg havde glemt virker fint her efter :D. Så kan man lære at læse bedre i sin bog :P, en bare at prøve en omvej som blev en underlig +opertor.

Nu virker det ordentligt med som jeg ville bruge fra start.

Str Str::operator+(const Str &other)
{
    Str result = *this;
    result += other;
    return result;
}
Os uden at min class leaker, hvilket altid er rart :D

Btw kan man tillade sig at stille et ekstra spørgsmål :P.

Min class indeholder kun 2 ting.
private:
    char *data;
    size_t size;

Er det nok at gøre ~Str(void) {free(data);} i min destructor ? Atlså er alt der skal slettes slettet ?

Findes der en smart måde at gøre dette nemt på uden forloop:
    for(unsigned int i=0; i<str.size;i++)
    {
        this->data[i] = str.data[i];
    }
?
Avatar billede veng Nybegynder
05. november 2010 - 18:57 #7
Da jeg satte breakpoints ind så det ud somom at
Str result = *this;
virkede fint nok kunne i hvert fald set at result fik størrelse og værdier, men det som ikke virkede uden copy contructer var
return result;
Men skal ikke kunne sige det med 100% sikkerhed :P, bare sådan jeg syns at se det nu
Avatar billede arne_v Ekspert
05. november 2010 - 19:07 #8
svar

normalt følges assignment operator og copy structor af - enten ingen eller begge
Avatar billede arne_v Ekspert
05. november 2010 - 19:09 #9
~Str(void) {free(data);}

ser nogenlunde ud, men jeg vil anbefale new/delete fremfor malloc/free
Avatar billede arne_v Ekspert
05. november 2010 - 19:09 #10
for løkken ligner noget der kan laves med memcpy !
Avatar billede veng Nybegynder
05. november 2010 - 19:25 #11
Takker =)
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