Globalny CString i alokacja

Odpowiedz Nowy wątek
2019-08-30 08:29
0

cześć, sto lat nie robiłem globalnych CStringów i nie pamietam teraz; Przykład, czy tu nie będzie wycieku pamięci?

//Globallny napis
const char* napis = "napis";
\void ustawNapis(const char* n)
{
napis = n; //Czy trzeba zdealokować wcześniej tego globala?
}

int main()
{
  const char* nap = "napis2";
  ustawNapis(nap);
}

na śmierć nie pamiętam.


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
edytowany 1x, ostatnio: kq, 2019-08-30 13:22

Pozostało 580 znaków

2019-08-30 09:05
3

Nie będzie wycieku pamięci. Zmienna globalna trafi do sekcji .rodata - danych tylko do odczytu. Literał zostanie załadowany tak czy inaczej, więc adres literału będzie dostępny przez cały czas działania programu. Gdyby literał nie był użyty w kodzie ani razu, zostałby usunięty przez kompilator w ramach optymalizacji i nie znalazłby się w binarce
.

edytowany 1x, ostatnio: PerlMonk, 2019-08-30 09:07

Pozostało 580 znaków

2019-08-30 09:08
0

Czemu miałby być wyciek, nie Alokujesz nowej pamięci na stercie (brak malloc), Dostajesz automatic storage, która nie wymaga deallokacji.


edytowany 1x, ostatnio: lion137, 2019-08-30 09:08

Pozostało 580 znaków

2019-08-30 09:11
2

Nie wystarczająco dużo danych. To zależy od kontekstu.
Jeśli ustawNapis przyjmuje własność napisu, to można przekazywać napisy tylko umieszczone na stercie, bo nie jesteś w stanie odróżnić napisu na stercie od na stosie albo globalnego literału (ergo nie można go inicjalizować by wskazywał literał).
Jeśli nie przejmuje własności to free jest zbędne i to caller jest odpowiedzialny za czas życia napisu, żeby nie doprowadzić do UB.

Nieważne jaki język zmienne globalne to samo zło.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2019-08-30 09:12

Pozostało 580 znaków

2019-08-30 09:30
0

te właśności mnie bolały to jest tak:
Jedna binarka i w niej string => IPC => odczyt std::string => zamiana tego na const char* i ustawienie zmiennej globalnej.
I tu mnie boli własność bo jest po drodze std::string, zastanawiam sięczy po prostu nie zrobić pustej tablicy tam i nie kopiować tego cstringu tam i będzie spokój.
A soft napisano jak napisano. zamykamy temat :)


We are the 4p. Existence, as you know it, is over. We will add your biological and technological distinctiveness to our own. Resistance is futile
edytowany 2x, ostatnio: revcorey, 2019-08-30 09:56

Pozostało 580 znaków

2019-08-30 10:41
3

Jakich fragmentów tego kodu jesteś właścicielem?
Jeśli jesteś właścicielem ostatnich części: odczyt std::string zamiana tego na const char* ustawienie zmiennej globalnej
To czemu sobie utrudniasz życie mieszajac C i C++ w ten sposób?
Szczerze nienawidzę kodu C++ pisanego w stylu C. Ta mania mieszania C i C++ wynika ze złego nauczania C++.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2019-08-30 10:42
ja tego nie napisałem. To jest kod jaki tu wydelopowano siedzę dopiero przy nim drugi dzień. Różni ludzie to pisali. Ja teraz poprawiam drobne bugi w implementacji. Gdyby ode mnie to zależało zrobił bym refactoring zaczynając od zmakniecia tego wszystkiego w strukturę, takiej władzy nie mam i musżę z tym żyć. - revcorey 2019-08-30 11:04
przyjrzałem się jeszcze jednej binarce(a w zasadzie warstwie integracyjnej) przez którą to przechodzi i tam obsługuje. Autorami są pewne duże korporacje, miszmasz C/C++. Gdybyś widział jakie oni cuda na rzutowaniu odstawiają to byś się za głowę złapał ;) - revcorey 2019-09-01 14:36

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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