C++ - Usuwanie dynamicznej tablicy

0

Zrobiłem sobie taki algorytm na własny użytek. I mam naprawdę bardzo mocne pytanie. Jak RZECZYWIŚCIE USUNĄĆ taką tablicę ?

int *sort(int[]);

int wiersz=9;

int main(void)
{
    int tab[9]={4,3,3,3,2,1,1,1,4};
    int ile_liczb=0;
    int element=0;
    int z_pom;
    int *wsk;

    wsk = sort(&tab[0]);

    for(int i=0; i<9; i++){
        z_pom = wsk[i];
        for(int j=element; j<9; j++){
            if(z_pom == wsk[j]){
                ile_liczb++;
                element++;
            }
        }

        if(ile_liczb != 0){
            std::cout << "liczba " << wsk[i] << " wystepuje " <<
ile_liczb << " raz(y)" << std::endl;
        }

        ile_liczb=0;
    }

    delete [] wsk;
    wsk = nullptr;

    return 0;
}

int *sort(int tSort[])
{
    int *_tSort = new int [wiersz];
    int zm_pom;

    for(int i=0; i<wiersz; i++){
        _tSort[i] = tSort[i];
    }

    for(int i=0; i<wiersz; i++){
        zm_pom = _tSort[i];

        for(int j=i+1; j<wiersz; j++){
            if(_tSort[j] < zm_pom){
                zm_pom = _tSort[j];
                _tSort[j] = _tSort[i];
                _tSort[i] = zm_pom;
            }
        }
    }

    return &_tSort[0];
}
3

delete [] wsk;
zaś wsk = nullptr; - nie jest konieczne.

0

jesteś w błędzie ;) zrób delete [] wsk, a potem poniżej odwołaj się do niej jeszcze raz i zobaczysz, że ta tablica wcale nie została zniszczona ;) dlatego ponawiam pytanie, jak to elegancko zrobić ;) tak, wiem, że są vectory ale mnie interesuje jak to robić bez nich, ponieważ tak czy inaczej w vectorach też podobny mechanizm musiał zostać zaimplementowany.

3

Z tego co piszą, odwołanie się do zdeletowanej pamięci to undefined behavior. "When you delete the memory doesn't necessarily alter the content of that memory, it just tells the operating system that that memory is available for reuse."

http://www.cplusplus.com/forum/beginner/199299/

0

zgodziłbym się pod warunkiem, że usuniesz właściwą tablicę. Spójrz na funkcję. Zwraca adres do utworzonej dynamicznej tablicy w funkcji int *sort(int[]);. Nie mogę wykonać delete [] _tSort gdyż nie będę mógł zwrócić adresu tej tablicy. Natomiast jeżeli chodzi o zmienną wskaźnikową wsk w funkcji main to zgodzę się z twierdzeniem o którym piszesz. Usuwam TYLKO zmienną wsk i już jej nie ma, a tablica _tSort jak była tak jest. Więc funkcja int *sort(int[]); generuje wyciek pamięci. Więc nadal zastanawiam się jak taką tablicę usunąć.

0

proste sprawdzenie:

cout<<wsk[0]<<endl;
delete [] wsk;
cout<<wsk[0]<<endl;
0
zkubinski napisał(a):

zgodziłbym się pod warunkiem, że usuniesz właściwą tablicę. Spójrz na funkcję. Zwraca adres do utworzonej dynamicznej tablicy w funkcji int *sort(int[]);. Nie mogę wykonać delete [] _tSort gdyż nie będę mógł zwrócić adresu tej tablicy. Natomiast jeżeli chodzi o zmienną wskaźnikową wsk w funkcji main to zgodzę się z twierdzeniem o którym piszesz. Usuwam TYLKO zmienną wsk i już jej nie ma, a tablica _tSort jak była tak jest. Więc funkcja int *sort(int[]); generuje wyciek pamięci. Więc nadal zastanawiam się jak taką tablicę usunąć.

Sam sobie stwarzasz problemy pisząc w kiepskim C.
W C++ mówimy zwalnianie a myślimy destruktor i na odwrót. Tam twojego problemu (a rozumiem do czego dążysz z tym returnem) w sensie dosłownym nie ma.
UPD A jak mówimy destruktor, to jest możliwy tylko w klasie

2

tak, wiem, że są vectory ale mnie interesuje jak to robić bez nich, ponieważ tak czy inaczej w vectorach też podobny mechanizm musiał zostać zaimplementowany

IMHO, po to właśnie zostały zaimplementowane vectory aby nie męczyć się z tego typu rzeczami. Operowanie na wskaźnikach zwiększa ryzyko popełnienia poważnych błędów, dlatego też w dzisiejszym C++ ( od stadardu 11 ) nie zaleca się ich używać. Zamiast tego są unique_ptr , shared_ptr.

I teraz porównaj swój algorytm do wersji napisanej w C++ 17.

#include <iostream>
#include <vector>
#include <map>

using namespace std;

int main()
{
    vector<int> data {4,3,3,3,2,1,1,1,4};
    map<int,int> result;

    for( const auto& element : data )
    {
        ++result[element];
    }

    for( const auto& [key,value] : result )
    {
        cout << "Number " << key << " has " << value << " occurrences\n";
    }

    return 0;
}
2

Gdyby nie to:

Rejestracja: 13 lat temu

to byłbym przekonany, że jesteś kolejnym newbem który nie rozumie czym jest alokacja/dealokacja. Na potrzeby tego posta założę, że jednak rozumiesz. W takim razie jedyne co mi przychodzi do głowy to funkcje do czyszczenia pamięci np. zawierającej wrażliwe dane (hasła, klucze, dane osobowe, etc):

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.