Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

c++ 11 copy assignment

Ostatnio zmodyfikowano 2017-09-21 22:35
Autor Wiadomość
aaadam
Temat założony przez niniejszego użytkownika
c++ 11 copy assignment
» 2017-09-21 21:27:28
witam, czytam sobie o c++ i natknąłem się na pewien artykuł rule of 5 i zastanawia mnie czy wewnatrz copy assigment nie powinienem usunąć tmp_cstring na końcu bloku czy jak usunę to usunie mi się też this->cstring...
pozrawiam


C/C++
class rule_of_five
{
    char * cstring; // raw pointer used as a handle to a dynamically-allocated memory block
public:
    rule_of_five( const char * arg )
        : cstring( new char[ std::strlen( arg ) + 1 ] ) // allocate
    {
        std::strcpy( cstring, arg ); // populate
    }
    ~rule_of_five()
    {
        delete[] cstring; // deallocate
    }
    rule_of_five( const rule_of_five & other ) // copy constructor
    {
        cstring = new char[ std::strlen( other.cstring ) + 1 ];
        std::strcpy( cstring, other.cstring );
    }
    rule_of_five( rule_of_five && other )
        : cstring( other.cstring ) // move constructor
    {
        other.cstring = nullptr;
    }
    rule_of_five & operator =( const rule_of_five & other ) // copy assignment
    {
        char * tmp_cstring = new char[ std::strlen( other.cstring ) + 1 ]; //chodzi mi o tmp_cstring
        std::strcpy( tmp_cstring, other.cstring );
        delete[] cstring;
        cstring = tmp_cstring;
       
        //zastanawiam się czy nie powinno być tutaj
        // delete[] tmp_cstring; bo przeciez wskaznik utworzony dynamicznie ale chyba jak to zrobię to usunę też co znajduje się w this->cstring
        return * this;
    }
    rule_of_five & operator =( rule_of_five && other ) // move assignment
    {
        if( this != & other ) // prevent self-move
        {
            delete[] cstring;
            cstring = other.cstring;
            other.cstring = nullptr;
        }
        return * this;
    }
    // alternatively, replace both assignment operators with
    //  rule_of_five& operator=(rule_of_five other)
    //  {
    //      std::swap(cstring, other.cstring);
    //      return *this;
    //  }
};
P-165082
pekfos
» 2017-09-21 21:40:42
Raz alokujesz i raz usuwasz, niekoniecznie to samo. Usuwanie więcej nie ma tu sensu i jak sam zauważyłeś, byłoby niepoprawne.
P-165083
aaadam
Temat założony przez niniejszego użytkownika
» 2017-09-21 21:59:08
to co się stanie z tmp_cstring  po wyjściu programu z bloku copy assigmenta ??bo wskaznik istnieje? czy poprostu nie przejmować się tym ?
P-165085
pekfos
» 2017-09-21 22:35:08
Ten blok będzie usunięty w destruktorze. Przecież nie tracisz tego adresu, tylko zapisujesz w obiekcie.
P-165094
« 1 »
  Strona 1 z 1