Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Uszkodzenie sterty podczas zwalniania dynamicznej pamięci

Ostatnio zmodyfikowano 2018-08-17 20:59
Autor Wiadomość
Gowers
Temat założony przez niniejszego użytkownika
» 2018-08-17 16:52:36
Autor podaje inny kod, ale chciałem zrobić na trochę innym, dlatego kombinuję po swojemu. W poleceniu jest o tworzeniu dynamicznie alokowanej pamięci, dlatego tak robię, zresztą chciałem to poćwiczyć trochę, żeby dobrze zrozumieć wskaźniki i dynamicznie alokowaną pamięć.

text[ counter ] = '\0';
Wychodzę poza zakres tablicy i naruszam jakąś komórkę pamięci, a gdy usuwam pamięć operatorem delete, to ta komórka jest usuwana razem z nią, dobrze to rozumiem? Bo uszkodzenie sterty wyskakuje, gdy zwalniam pamięć.

C/C++
char * a = & firstText[ 0 ]; // std::string to nie tablica znaków to jest dziwne!!! i nawet nie wiem czy ma sens
No, ale ten zapis jest chyba też poprawny? String nie jest tablicą znaków?

Nie wywo ł uj bez przerwy strlen(), podnosisz przez to z ł o ż ono ś ć obliczeniow ą do kwadratowej.
W sensie, że lepiej byłoby wynik strlena zapisać do inta i korzystać z niego?

I jeszcze miałbym pytanie, jeśli robiłbym to dalej na stringach, to string.size() i strlen() działają podobnie szybko czy są między nimi jakieś różnice?
P-172145
pekfos
» 2018-08-17 17:04:41
jeśli robiłbym to dalej na stringach, to string.size() i strlen() działają podobnie szybko czy są między nimi jakieś różnice?
size() to O(1), strlen() to O(n).

W sensie, że lepiej byłoby wynik strlena zapisać do inta i korzystać z niego?
Jak znajdziesz jakiś mniej oczywisty sposób na to, by nie wywoływać bez przerwy strlen(), to też się nada.

C/C++
char * a = & firstText[ 0 ]; // std::string to nie tablica znaków to jest dziwne!!! i nawet nie wiem czy ma sens
No, ale ten zapis jest chyba też poprawny? String nie jest tablicą znaków?
Ten zapis jest poprawny.

Wychodzę poza zakres tablicy i naruszam jakąś komórkę pamięci, a gdy usuwam pamięć operatorem delete, to ta komórka jest usuwana razem z nią, dobrze to rozumiem? Bo uszkodzenie sterty wyskakuje, gdy zwalniam pamięć.
Przekroczenie zakresu ma niezdefiniowane zachowanie.
P-172146
mateczek
» 2018-08-17 17:06:27
std::string ma faktycznie wewnątrz siebie tablicę danych ale tablicą nie jest.

C/C++
#include<string>
#include<iostream>
using namespace std;

int main()
{
    string a { "ala ma kota" };
    //a[index] to jest właściwie funkcja "a.operator[](index)" przeciążenie operatorów
    //taki operator faktycznie zachowuje się jak tablica jednak nic nie stawia problemów by zachowywał się inaczej.
    cout << a.operator []( 0 ); //to samo co a[0] ; tak działa przeciążanie operatorów co sprawia że operator "[]" w kontekście obiektu "a" mógłby być prawie dowolną funkcją
   
}

ten zapis jest poprawny??
C/C++
char * a = & firstText[ 0 ];
//A w kontekście korzystania z niego jako tablicy
a[ 23 ] = 'c' //też jest to poprawne??
P-172147
jankowalski25
» 2018-08-17 18:02:28
C/C++
a[ 23 ] = 'c' //też jest to poprawne??
Jeśli
firstText.size() >= 24
, to można tak zrobić, inaczej jest to UB przy metodzie
operator []
.
P-172148
Gowers
Temat założony przez niniejszego użytkownika
» 2018-08-17 20:59:33
Dziękuję wszystkim za pomoc.
P-172149
1 « 2 »
Poprzednia strona Strona 2 z 2