• 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

VPS Starter Arubacloud
0 głosów
164 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 159 wizyt
0 głosów
1 odpowiedź 261 wizyt
pytanie zadane 7 kwietnia 2023 w C i C++ przez Zuzan Początkujący (390 p.)
0 głosów
1 odpowiedź 372 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...