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

Dynamiczne alokowanie pamięci

Ostatnio zmodyfikowano 2020-02-02 12:59
Autor Wiadomość
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:

C/C++
#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]
P-176132
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
P-176133
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.
P-176134
mizie
» 2020-02-02 12:59:37
Twój program powinien wyglądać mniej więcej tak:

C/C++
#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;
    // cout << tablicaPrzepisana << endl; // odwazni moga sprawdzic, czy po zwolnieniu pamieci tekst ciagle tam rezyduje :)
    system( "PAUSE" );
    return 0;
}
P-176163
« 1 »
  Strona 1 z 1