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

Wskaźniki w funkcji w C++

Object Storage Arubacloud
+1 głos
141 wizyt
pytanie zadane 3 lipca 2020 w C i C++ przez spreadq Nowicjusz (130 p.)

Wewnątrz funkcji string_to_char alokuje dynamicznie pamięć. Funkcja zwraca mi wskaźnik do tej zmiennej char. Tylko potem tworzę kolejny wskaźnik i do niego przypisuję to co mi zwraca funkcja czyli wskaźnik. Który wskaźnik mam usunąć? Kiedy wstawić delete? Czy jak usunę wskaźnik *ntab to usunę również *tab? 

Według mnie tworzę wskaźnik do wskaźnika i jak usunę jeden to jednocześnie usuwam drugi?

(Tak, wiem powinienem zainicjować wsk w main).

#include<string.h>
#include<iostream>

using namespace std;

//Funkcja zwraca wsk do char
char * string_to_char( string &s)
{
    char *tab = new char [s.size() + 1];
    for (int i = 0; i< s.size(); i++)
    {
        tab[i] = s[i];
    }
    return tab;
}

int main()
{
    char *ntab;
    string s = "Jan";
    s += " Jan";
    cout << s << endl;
    ntab = string_to_char(s);
    cout << ntab << endl;
    delete ntab;
    return 0;
}

 

1
komentarz 3 lipca 2020 przez j23 Mędrzec (194,920 p.)

std::string ma metodę c_str, która zwraca wskaźnik na dane. A jak chcesz zrobić kopię i zrobić to w bezpieczny sposób, to:

std::vector<char> buf(s.begin(), s.end());

Nie ma co wymyślać koła na nowo ;)

 

PS. nie ustawiasz zera na końcu łańcucha w nowej pamięci - to błąd. No i tablice zwalniamy wyrażeniem delete[].

komentarz 3 lipca 2020 przez spreadq Nowicjusz (130 p.)

Ok dzięki, taki przykład robiłem tylko w ramach ćwiczeń. Błąd z zerem /0 na końcu char poprawiony. Chyba z tym zwalnianiem tablicy za pomocą delete może być problem bez większej modyfikacji programu. Właśnie o to głównie mi chodziło. To zmienna lokalna. A chcę ją "zwrócić". Nie mogę dodać tego delete po return ani przed. W main mi jej nie widzi. Jedyne rozwiązanie (Pomijając wskaźniki inteligentne itd) jakie przychodzi mi na myśl to zmiana funkcji na

void str_to_char (wsk_do_pamieci_zaalokowanej_dynamicznie, referencja_s);

Tablicę char zadeklaruję w funkcji main() i wtedy będę mógł użyć delete.

komentarz 3 lipca 2020 przez j23 Mędrzec (194,920 p.)

Nie mogę dodać tego delete po return ani przed.

Pisałem o delete w main (25).

1 odpowiedź

+2 głosów
odpowiedź 3 lipca 2020 przez draghan VIP (106,230 p.)

Nie usuwasz żadnego wskaźnika (zmiennej). Wskaźniki usuwają się automatycznie, kiedy program opuszcza ich zakres.

Zupełnie inną kwestią jest zaalokowana pamięć. Operator new alokuje na stercie pewien obszar pamięci. Operator delete zwalnia pewien obszar pamięci ze sterty. Wskaźnikiem tylko pokazujesz na ten fragment pamięci i nie ma znaczenia, ile będzie "pośrednich" zmiennych wskaźnikowych. Raz zwolniona pamięć już nie jest Twoja i wszystkie wskaźniki pokazujące wcześniej na ten obszar są "nieprawidłowe" do użycia. Musisz być jednak świadomy, że operator delete zwolni pamięć, ale nie zmodyfikuje wartości żadnego wskaźnika (zmiennej) - po wywołaniu delete one wciąż będą przetrzymywać adresy do pamięci, która już nie jest Twoja i to Twoim zadaniem jest o tym pamiętać i je wyzerować.

To dobre miejsce żeby poczytać o wskaźnikach "inteligentnych" oraz o tym, że w dobrym kodzie zazwyczaj nie używa się new/delete nieopakowanych w klasy które automatycznie zadbają o zwalnianie pamięci razem z wyjściem z zakresu.

Podobne pytania

0 głosów
2 odpowiedzi 1,017 wizyt
pytanie zadane 28 września 2018 w C i C++ przez eSpring Początkujący (270 p.)
0 głosów
1 odpowiedź 789 wizyt
pytanie zadane 28 maja 2018 w C i C++ przez periedynek Obywatel (1,320 p.)
0 głosów
2 odpowiedzi 2,177 wizyt
pytanie zadane 15 października 2016 w C i C++ przez Rumci Nowicjusz (220 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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!

...