Tworzenie obiektu a zarzadzanie pamięcią

Odpowiedz Nowy wątek
2011-08-02 11:27
Cpper
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

Pozostało 580 znaków

2011-08-02 11:44
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 );

edytowany 2x, ostatnio: absent, 2011-08-02 11:45

Pozostało 580 znaków

2011-08-02 11:44
0
  1. co robi addItem
  2. co rozumiesz przez posprzatam tablice

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
1. "Metoda ta powoduje wrzucenie obiektu do jakiejś powiedzmy tablicy w tej klasie." 2. Obstawiam, że chodzi o delete[]. - absent 2011-08-02 11:47

Pozostało 580 znaków

2011-08-02 11:51
Cpper
0

Dziękuje bardzo za pomoc :)

PS. Tak, chodzi o delete[]

Pozostało 580 znaków

2011-08-02 11:59
0

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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
Wyjaśnij jaka różnicę tu wprowadza klasa w przeciwieństwie od struktury? - absent 2011-08-02 12:11

Pozostało 580 znaków

2011-08-02 12:05
Cpper
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?

Pozostało 580 znaków

2011-08-02 12:17
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.

edytowany 4x, ostatnio: Azarien, 2011-08-02 12:19

Pozostało 580 znaków

2011-08-02 12:19
Cpper
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?

Nie będziesz mieć wycieku. - absent 2011-08-02 12:25

Pozostało 580 znaków

2011-08-02 12:30
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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-08-02 12:32
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.

edytowany 6x, ostatnio: Azarien, 2011-08-02 12:42

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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