Uszkodzenie sterty podczas zwalniania dynamicznej pamięci
Ostatnio zmodyfikowano 2018-08-17 20:59
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ęć. char * a = & firstText[ 0 ];
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? |
|
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. char * a = & firstText[ 0 ];
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. |
|
mateczek |
» 2018-08-17 17:06:27 std::string ma faktycznie wewnątrz siebie tablicę danych ale tablicą nie jest. #include<string> #include<iostream> using namespace std;
int main() { string a { "ala ma kota" }; cout << a.operator []( 0 ); }
ten zapis jest poprawny??
char * a = & firstText[ 0 ];
a[ 23 ] = 'c'
|
|
|
jankowalski25 |
» 2018-08-17 18:02:28 Jeśli firstText.size() >= 24 , to można tak zrobić, inaczej jest to UB przy metodzie operator [] . |
|
Gowers Temat założony przez niniejszego użytkownika |
» 2018-08-17 20:59:33 Dziękuję wszystkim za pomoc. |
|
1 « 2 » |