[C++] Zwracanie obiektu z własnym destruktorem przez funkcję


(Lol600000065) #1

czesc,

zwracam obiekt przez funkcję, który posiada destruktor (zwalnia on miejsce w dynamicznej tablicy operatorem delete []). Jak nietrudno sie domyslic, po zwroceniu przez funkcje tego obiektu, do tej tablicy nie ma co zaglądac. Jeżeli to ma jakies znaczenie to ten obiekt jest mojego typu X (klasa) i po zwroceniu przez funkcje stoi po prawej stronie operatora przypisania (przeladowanego dla klasy).

Jak mogę to naprawić, tzn. uruchomić destruktor (ktory zreszta sam sie uruchomi) ale jednoczesnie utworzyc jakos kopie tego obiektu zeby nie ginał od razu po zwroceniu z funkcji ?


(Witos) #2

Poczytaj o konstruktorze kopiującym. W tym konstruktorze musisz utworzyć kopię tablicy dla nowo tworzonego obiektu.

ClassA

{

public:

        ClassA() { tab = new char [1024]; } // Zwykly konstruktor

        ClassA(const ClassA & o) { tab = new char [1024]; memcpy(tab, o.tab, 1024); } // Konstruktor kopiujacy

        ~ClassA() { delete [] tab; } // destruktor


        ClassA & operator=(const ClassA & o) { tab = new char [1024]; memcpy(tab, o.tab, 1024); } // przeciążony operator przypisania


private:

        char * tab;

};

Ewentualnie allokuj obiekt dynamicznie i zwracaj przez wskaźnik - wtedy nie ma kopiowania. Albo skorzystaj z dobrodziejstw C++11 i zrób konstruktor "przenoszący" - wtedy też unikniesz kopiowania

ClassA(ClassA && o) { tab = o.tab; o.tab = nullptr; } // Konstruktor przenoszący

ClassA obj = std::move(jakas_funkcja_zwracajaca_obiekt_typu_ClassA());