• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wyciek pamięci, błąd w przekazaniu argumentu

Object Storage Arubacloud
0 głosów
167 wizyt
pytanie zadane 16 maja 2019 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)

Mam zmienną strukturalną 

struct bohater{
    string imie;
    int rasa;
    vector <string> cechy_rasowe;
};

Inicjalizuje ją w mainie

struct bohater postac;

I teraz chcę ją kolejno przekazywać do kilku różnych funkcji które będą wypełniać jej pola danymi

Ale gdy wywołuję coś takiego:

ustaw_cechy_rasowe(postac);

Wtedy wylewa się pamięć.

Nagłówek funkcji wygląda tak:

void ustaw_cechy_rasowe(struct bohater)

Innymi słowy jak poprawnie podać zainicjalizowaną zmienną strukturalną jako argument funkcji?

komentarz 17 maja 2019 przez criss Mędrzec (172,590 p.)
Jak to "wylewa się pamięć"? Znasz znaczenie "memleak"? Po prostu nie używaj słów których znaczenia nie znasz, bo twoje pytania stają się niejasne.

1 odpowiedź

0 głosów
odpowiedź 17 maja 2019 przez mokrowski Mędrzec (155,460 p.)

Innymi słowy jak poprawnie podać zainicjalizowaną zmienną strukturalną jako argument funkcji?

Tak jak w każdym przypadku gdy chcesz przekazać dane a nie kopię danych. Czyli jako referencję, referencję stałą, wskaźnik (ew. stały lub na stałe dane).

Czyli:

1. Referencję (czyli nie kopię co robisz w swoim kodzie).

void ustaw_cechy_rasowe(bohater& b);

2. Referencję stałą:

void wyswietl_cechy_rasowe(const bohater& b);

3. Wskaźnik na dane zmieniane:

void ustaw_cechy_rasowe(bohater * b);

4. Wskaźnik na stałą:

void wyswietl_cechy_rasowe(const bohater * b);

5. Stały wskaźnik na stałą:

void wyswietl_cechy_rasowe(const bohater * const b);

Jak widzisz (z nazw funkcji które podałem), wskaźniki na stałą oraz stałe referencje, nie umożliwiają modyfikacji. Więc co do literalnego potraktowania Twojego pytania, interesują Cię sposoby (1) i (3). Dobra praktyka jednak preferuje sposób (1).

Z kodu który podałeś to nie wynika. Podejrzewam jednak że alokujesz strukturę bohater dynamicznie (new). W takim przypadku niezbędne jest jej zwolnienie przez delete. To może być jeden z powodów wycieku pamięci.

W języku C++ (takie ma tagi Twoje pytanie), nie podaje się słowa kluczowego struct w argumentach funkcji. Struktura tworzy byt tożsamy z klasą czyli typem. To C wymaga podawania słowa kluczowego struct w argumentach funkcji.

Przeczytaj także co robi konstruktor domyślny który u Ciebie występuje w strukturze bohater.

Podobne pytania

+1 głos
0 odpowiedzi 164 wizyt
0 głosów
1 odpowiedź 281 wizyt
pytanie zadane 7 kwietnia 2023 w C i C++ przez Zuzan Początkujący (390 p.)
0 głosów
1 odpowiedź 392 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...