Tworzenie obiektu a zarzadzanie pamięcią

0

Witam,
dręczy mnie jedno pytanie, otóż mam zdefiniowaną structurę o nazwie powiedzmy Obiekt, tworzę instancję jak niżej i przekazuję takie obiekt metodą addItem klasy MojaKlasa. Metoda ta powoduje wrzucenie obiektu do jakiejś powiedzmy tablicy w tej klasie:

 
void funkcja(){
    Obiekt obj;
    obj.x =0; obj.y = 0; 
    mojaKlasa.addItem(obj);
}

i moje pytanie brzmi
czy obiekt obj po wykonaniu funkcji żyje dalej już tylko w tablicy w mojaKlasa?
Czy jesli posprzatam tablice przy wychodzeniu z programu to wszystko co zwiazane z obiektem obj będzie posprzątane?

Drugie pytanie to czy da się taką strukture zainicjalizować w jednej linijce w stylu:
Obiekt obj = {x:0, y:0}; //oczywiście to nie działa ale czy jest jakiś podobny sposób?

Z góry dzieki za odpowiedzi i zainteresowanie

0

Cześć!

Instancja obj przepada w momencie zakończenie się funkcji "funkcja" (niezręcznie to nazwałeś), ale, że wywołujesz addItem to w tym momencie dochodzi do przekopiowania danych klasy. Zatem te dane będą "żyć" już tylko w tablicy. Zatem jeśli detonujesz tablice to te dane przepadną.

Co do drugiego pytania, zalecam poczytać o tym, czym jest konstruktor. Dzięki niemu będziesz mógł dane tworzyć w poniższy sposób:
Obiekt obj( 0, 0 );

0
  1. co robi addItem
  2. co rozumiesz przez posprzatam tablice
0

Dziękuje bardzo za pomoc :)

PS. Tak, chodzi o delete[]

0

sorka nie doczytałem, że chodzi o strukturę a nie klasę :/

0
Misiekd napisał(a)

sorka nie doczytałem, że chodzi o strukturę a nie klasę :/

a to różnica między klasą a strukturą jest większa niż tylko public/private jeśli chodzi o ich składowe?
Tzn przy klasie jeśli nie przekażę wskaźnika tylko instancję będzie wyciek, a przy strukturze już nie?

0

Jeśli mowa o C++, to struct i class różnią się TYLKO tym, że struct ma pola domyślnie public, a class ma domyślnie private.
Powyższe słowo „tylko” należy traktować ściśle i absolutnie, w każdym przypadku.
Przykładowo zapis

class Foo {
public:
 ...
};

to to samo co

struct Foo {
 ...
};

a zapis

struct Bar {
private:
...
};

to to samo co

class Bar {
...
};

struct i class można ze sobą mieszać, na przykład dziedziczyć struct po class a class po struct.

0

Wiec podsumowując:

czy jeśli zrobię obiekt i przekażę go (nie jego wskaźnik a obiekt, instancję) do metody addItem (która robi powiedzmy jakisVector.push_back(obiekt) )
to czy pozniej przy zdeletowaniu tablicy/vectora etc, bede mial wyciek czy nie?

0

to pytanie pomocnicze - czy jeśli zmienna jest typu struct to trzeba ją zwalniać przez wywołanie destruktora? Czy jeśli tego nie zrobimy to mamy wyciek? Bo jeśli tak to posprzatam tablice - delete[] doprowadzi do wycieku pamięci. Drugie pytanie czy Obiekt obj;, gdzie Obiekt to struktura i następnie Obiekt obj2; obj2 = obj; to przekopiowanie całego obiektu czy tylko przypisanie adresu obj do obj2? Bo jeśli 1 i trzeba zwalniać to jest kolejny wyciek bo po wyjściu z funkcja obj nie zostaje zwolniony.

Co do powyższych pytań to nie zjebcie mnie bo z c++ miałem ostatnio do czynienia dawno temu, a w językach w których pisze na co dzień nie mam takich problemów - w Delphi jest to jasne rozróżnienie a w c# jest gc, który niejako zwalnia mnie od zastanawiania się nad tym :p

0

delete[] spowoduje wykonanie destruktorów wszystkich elementów tablicy.

. Drugie pytanie czy Obiekt obj;, gdzie Obiekt to struktura i następnie Obiekt obj2; obj2 = obj; to przekopiowanie całego obiektu czy tylko przypisanie adresu obj do obj2
spowoduje przekopiowanie całego obiektu, bo Obiekt to cały obiekt, a nie wskaźnik na obiekt. Wskaźnikiem byłoby Obiekt*, a referencją (coś jak ukryty wskaźnik) Obiekt&.

w Delphi i C# wszystkie obiekty typu class są referencjami w sensie C++.
Natomiast class i struct z C++ zachowują się jak record lub object w Delphi lub jak struct z C#.

w C++ tak długo jak używasz obiektów bez wskaźników ani referencji, nie ma szans na wyciek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1