Dynamiczne alokowanie pamięci
Ostatnio zmodyfikowano 2020-02-02 12:59
Yexy Temat założony przez niniejszego użytkownika |
Dynamiczne alokowanie pamięci » 2020-01-26 12:45:23 Cześć! Mam takie oto zadanie: Napisz funkcję, która w argumencie otrzyma adres do zmiennej typu string i zwróci zwykły wskaźnik na nową/dynamiczną tablicę char o najmniejszym możliwym rozmiarze do przechowywania ciągu znaków skopiowanych z argumentu. Zadbaj o usunięcie rezerwacji we właściwym momencie Napisałem taki oto program: #include <stdio.h> #include <string.h> #include <cstdlib> #include <iostream>
using namespace std;
char * zwrocWsk( string & tekst ) { char * tab = new char[ tekst.size() ]; for( int i = 0; i < tekst.size(); i++ ) { *( tab + i ) = tekst[ i ]; } delete[] tab; return tab; }
int main() { string tekst = "QWERTY"; char * tablicaPrzepisana = zwrocWsk( tekst ); cout <<*( tablicaPrzepisana + 1 ) << endl; }
I moje pytanie brzmi, w którym momencie jest ten WŁAŚCIWY moment usuwania rezerwacji? Mam to zrobić w funkcji, tak jak jest teraz? Czy mam na koniec programu użyć delete dla zmiennej tablicaPrzepisana? Bo się już pogubiłem nie ważne gdzie dam delete to i tak mogę wypisać normalnie dane, czy to się różni? [/i] |
|
nanoant20 |
» 2020-01-26 16:14:51 Dynamicznie alokowana pamięci należy do procesu. Pamięć w większości systemów jest automatycznie zwalniana przez system operacyjny po zakończeniu procesu, ale zależy to od systemu. Generalnie więc dobrym pomysłem jest zwolnienie pamięci w funkcji, niż czekać aż program się zakończy, ponieważ może to wpłynąć na wydajność lub szybko zostanie zjedzona cała dostępna pamięć. link do tematu: "Does memory allocated in a function still stay allocated after the function returns?" na stackoverflow |
|
pekfos |
» 2020-01-26 16:49:40 Zwalniasz pamieć, gdy nie jest już potrzebna. Gdy robisz to w tej funkcji, zwracanie wskaźnika jest już bezcelowe, bo pamięć do Ciebie już nie należy i może być zajęta w innym celu, lub wymazana przez mechanizmy debugowania pamięci. Jako bonus dodam, że alokujesz za mało pamięci. Wskaźnik na pamięć jest zawsze związany z jakąś formą określenia, ile tej pamięci jest. W przypadku łańcucha znaków używa się bajtu zerowego na końcu tekstu, którego nie uwzględniasz przy alokacji pamięci i w żaden sposób nie zapisujesz w docelowej lokalizacji. |
|
mizie |
» 2020-02-02 12:59:37 Twój program powinien wyglądać mniej więcej tak: #include <iostream> #include <string> using namespace std;
char * zwrocWsk( const string & tekst ) { char * tab = new char[ tekst.size() + 1 ]; for( int i = 0; i < tekst.size(); i++ ) { *( tab + i ) = tekst[ i ]; } tab[ tekst.size() ] = '\0'; return tab; }
int main() { string tekst = "String prawidlowo skopiowany do tablicy znakowej."; char * tablicaPrzepisana = zwrocWsk( tekst ); cout << tablicaPrzepisana << endl; cout << "Tekst znajduje sie pod adresem: " <<( void * ) tablicaPrzepisana << endl; delete[] tablicaPrzepisana; system( "PAUSE" ); return 0; }
|
|
« 1 » |