Skocz do zawartości

[C++]Czy string, do którego definiuje wskaźnik może nagle "wyparować"?


halil1107

Polecane posty

Zacznę od tego, że przykład ten nie jest zgodny z ISO oraz staram się go rozbroić bez konieczności sięgania do biblioteki <string>. Na wstępie, definiując wskaźnik "nazwa" do zmiennych char ustawiam go na początku stringu, np. "Alamakota":

char *nazwa = "Alamakota";

Latawiec klasy obiekt "otrzymał" wskaźnik i ma na imię Pankracy. Imię to nie znajduje się się w latawcu fizycznie (czyli jakiejś tam tabeli). Jest możliwość, że deklaracje kolejnych zmiennych zarezerwują pamięć na tym stringu?

Mam nadzieję, że udało mi się ten problem jakoś przedstawić zrozumiale.

Link do komentarza
Udostępnij na innych stronach

Głowy nie daję, ale to chyba działa tak, że przed samym wywołaniem konstruktora tworzony jest ów "Pankracy". Potem wywołuje się konstuktor (przekazywany jest wskaźnik do stringa), a na koniec string jest zwalniany. Dlatego pod obiekt::nazwa nie będzie tego wyrazu i nic się nie wyświetli.

Pozdrawiam,

vo7 (;

Link do komentarza
Udostępnij na innych stronach

Ale czy string który jest użyty tylko jako parametr nie jest zwalniany po wywołaniu funkcji?

 jakasFunkcja("Jakis string"); //po wykonaniu "Jakis string" zostanie zwolniony

char s[] = "Jakis string";
jakasFunkcja(s); // tutaj nie ma zwalniania "s"

Pozdrawiam,

vo7 (;

Link do komentarza
Udostępnij na innych stronach

Ten przykładowy kod raczej wyraźnie do mnie przemawia ;) W sumie, byłoby to nielogiczne, żeby program pilnował obszarów pamięci nawet wtedy kiedy na poziomie kompilacji wprowadzono jakieś wartości nie mające nazwy. Jeżeli przyjąć, że string zachowa się tak jak jawnie wywołany konstruktor, to jest to też wystarczający dowód, że string przepada (chociaż ja zdefiniowałem wskaźnik do niego, to prędzej czy później string może zostać nadpisany).

 

Nie robiłbym z tego problem gdyby nie to, że po pierwsze warto wiedzieć ( ;) ), po drugie staram się w miarę możliwości kodować coś co nie będzie niepotrzebnie zajmować miejsca w pamięci. Jeżeli użyję kod wstawiony do pierwszego postu, zadeklaruje "nazwa" jako tablicę. Napiszę w konstruktorze funkcję, która przepisze string "Pankracy" do tej tablicy-nazwy wszystko na bank będzie OK.

 #include <iostream.h>

class obiekt
{
char nazwa[10];
public:
      obiekt(char *naz)     {/*jakiś tam algorytm przepisujący to co wskazuje naz do tablicy nazwa*/}      
      void pokaz()
      {
      for (int i=0 ; i<10 ; i++) cout<<*(nazwa+i);    
      }      
};

main()
{
obiekt latawiec("Pankracy");
latawiec.pokaz();
}

Ale jeżeli program przypilnuje wysłanego do konstruktora stringa to będę za każdym razem definiowania obiektu zużywał dwukrotnie więcej pamięci na nazwę ;)Zdaje mi się, że żeby ustrzec takie dane przed utratą wymyślono dynamiczną alokacje "new". Dzięki za odpowiedzi.

Link do komentarza
Udostępnij na innych stronach

Nie jestem pewiem czy dobrze Was zrozumiałem, ale wydaje mi się, że ten string "Alamakota" i wszystkie zmienne "beznazwy" są na stałe.

 

Przykład:

 

[cpp]

void funkcja(int a, char *B)

{

return;

}

 

funkcja(1, "Alamakota");

 

[/asm]

 

 

W każdym wywołaniu tej funkcji z tymi parametrami przekazywany jest offset do zmiennej napis, czyli jak wywołasz funkcje 10 czy 500 razy, to i tak w pamięci będzie jedna kopia stringa. Poprawcie mnie jeśli się mylę.

Lubię cytryny !

Link do komentarza
Udostępnij na innych stronach

Dzięki za linki. Potrzebowałem tego :)

Nie będę kombinował, zdam się na was. Ustaliliście, że zmienne "bez nazwy" i to co wysyłamy do różnych funkcji pozostaje na stałe w pamięci. Chciałbym o coś jeszcze zapytać. Skoro jest to zatem ogólna reguła, czy można się spodziewać różnych reakcji wśród różnych kompilatorów? (jakich odstępstw od tego?)

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...