Przekazywanie wskaźnika dynamicznego do funkcji

0

Witam,
Chciałbym przekazać wskaźnik utworzony dynamicznie do funkcji żeby tam wykonał swoje zadanie. Zastanawiam się tylko gdzie mam go usunąć? Myślę, że już w głównej funkcji a nie w tej wywołanej ale nie jestem pewny. Czy przekazując wskaźnik do funkcji robię jego kopię i mam dwa wskaźniki do tego samego obiektu? Jeśli tak to powinienem usunąć dwa jeden w funkcji głównej i drugi w funkcji wywoływanej. Dziękuję

void Funkcja( TStrings* plik )
{
  ............
  delete plik; // ???
}

Void Main()
{
  TStrings* plik = new TStringList;
 
  Funkcja( plik );

  delete plik;
}
2

W Twoim przypadku wskaźnik jest zwykłą zmienną tworzoną na stosie, więc nie musisz/nie możesz go ręcznie usunąć. Sam zniknie jak wyjdziesz z bloku w którym został stworzony. To co musisz ręcznie usunąć to dynamiczna pamięć zarezerwowana na stercie.
Inaczej mówiąc możesz mieć sto wskaźników wskazujących na ten sam obszar pamięci, ale sprzątać musisz tylko raz. Wielokrotne wywołanie delete na tym samym adresie to poważny błąd.

Zastanawiam się tylko gdzie mam go usunąć?
W tym samym bloku, gdzie tę pamięć zarezerwowałeś. Od tej reguły są wyjątki, ale na początku lepiej się trzymać reguły.

0

Dziękuję. Jeszcze jedno pytanie. Czy usunięcie wskaźnika jest jednoznaczne ze zwolnieniem pamięci w sensie, że program usuwa dane fizycznie? Czy też może zachodzi to dopiero po zamknięciu aplikacji?

0

Co rozumiesz przez usunięcie wskaźnika? Co przez usuwa dane fizycznie?

0

Usunięcie wskaźnika czyli polecenie delete usuwa dane fizycznie czyli zwalnia pamięć fizycznie, jest jej więcej niż przed wczytaniem zawartości z pliku na przykład.

2

Dane nie są "usuwane fizycznie" w tym sensie, że przejeżdża po nich walec. Po prostu obszar pamięci, w którym dane się znajdowały jest oznaczany jako wolny (a właściwie usuwany z listy obszarów zajętych) i może od tej pory zostać zajęty przez inne obiekty.
Dane w RAM fizycznie pozostają do momentu zapisania ich czymś innym (ale próba ich odczytania już po deleteto tzw. “undefined behavior”, niezdefiniowane zachowanie).

1

Odpowiedź na pytanie napisał już @Azarien, natomiast ja się "przyczepię" do czegoś innego.

Usunięcie wskaźnika to mylne określenie, które wprowadza w błąd. Wskaźnika nie usuwasz, po wykonaniu delete/delete[] nadal jest poprawną zmienną i ciągle wskazuje na ten sam obszar pamięci (ale już nie wolno się do niej odwołać). Możesz też takiego wskaźnika dalej używać:

int x = 1;

int* ptr = new int [10];
delete[] ptr;

ptr = &x;
cout << *ptr;

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