• 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

0 głosów
54 wizyt
pytanie zadane 16 maja w C i C++ przez Alan Kruszyński Obywatel (1,200 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 przez Criss Mędrzec (171,380 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 przez mokrowski VIP (110,820 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 46 wizyt
0 głosów
2 odpowiedzi 104 wizyt
pytanie zadane 28 stycznia w C i C++ przez kacper1445 Gaduła (3,130 p.)
0 głosów
2 odpowiedzi 510 wizyt
pytanie zadane 5 grudnia 2016 w C i C++ przez konrad99 Gaduła (4,100 p.)
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

66,451 zapytań

113,207 odpowiedzi

239,680 komentarzy

46,704 pasjonatów

Przeglądających: 272
Pasjonatów: 13 Gości: 259

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...