Różnica dynamicznej alokacji pomiędzy C++ a C

2013-12-16 22:30
0

mam taki problem, pisze program w c++ i, dynamiczną tablice robie za pomocą new i usuwą ją za pomocą delete.
Ale jak ją zwiększyć lub pomniejszyć to c++ NIE MA czegoś takiego jak realloc, więc zrobiłem taka funkcje sobie sam.
Ale c++ wspiera wszystkie funkcje z C, więc jeśli zacznę korzystać z malloca, realloca i free, to to będzie jakieś dużo naruszenie
"myśli obiektowej", czy mogę sobie z nich korzystać bez żadnych problemów.
a jeśli new jest lepsze to dlaczego??

Pozostało 580 znaków

2013-12-16 22:39
kq
0

Dlaczego nie użyjesz kontenera typu std::vector? Wszelkie realokacje dzieją się "pod maską" i nie musisz się przejmować czyszczeniem zasobów. Jeśli to niemożliwe, to faktycznie będziesz potrzebował malloc, realloc i free


Pozostało 580 znaków

2013-12-16 22:52
0

nie korzystam z vector, bo jestem dopiero w gdzieś w 2/3 książki a one są omówione w ostatnim rozdziale, a che sobie napisać coś z wykorzystaniem class.
więc c++ nie ma czegoś takiego jak realoc, bo te vektory sobie z tym jakoś radzą(na razie nie mam o nich pojęcia).
ale czy z malloc i całej reszty mogę korzystać swobodnie w c++, czy lepiej tego unikać??

edytowany 1x, ostatnio: Kosimazaki123, 2013-12-16 22:53

Pozostało 580 znaków

2013-12-16 23:50
1

Te funkcje z C zwracają wskaźnik void. Dodatkowo operator new (new[]) przy stwarzaniu naszego typu obiektu (klasa) moze wywołac automatycznie konstruktor. malloc nie może. To samo z delete i destruktorem. Stosuj operatory z C++, dosc łatwo jest napisac funkcje powiększającą tablice, coś na wzór realloc.


edytowany 1x, ostatnio: pingwindyktator, 2013-12-16 23:54

Pozostało 580 znaków

2013-12-16 23:55
1

Korzystać możesz swobodnie, byle malloc,realloc,free odnosili się wyłacznie do typów prostych (chyba że próbujesz przeciążyć new)


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-12-17 15:10
1

Ale jeśli zacznę korzystać z malloca, realloca i free, to to będzie jakieś dużo naruszenie "myśli obiektowej", czy mogę sobie z nich korzystać bez żadnych problemów.

To dwie niezależne sprawy. Skupię się na drugiej.
Tak, można korzystać bez problemów.

Ale to co było przydzielone przez new, powinno być zwolnione przez delete, a to co przydzielone przez malloc powinno być zwolnione przez free.
Dlatego też nie powinieneś używać (oryginalnego) realloc do realokacji pamięci przydzielonej przez new.

W praktyce jednak alokacja przez (nie przeciążone) new i przez malloc odbywa się w ten sam sposób, więc takie mieszanie będzie działać - choć tak być nie musi, więc nie powinno się tego robić.

edytowany 2x, ostatnio: Azarien, 2013-12-17 15:11

Pozostało 580 znaków

2013-12-17 18:26
0

a taka realokacja może być??

moja_klasa * zwieksz_tab(moja_klasa * wsk, int rozmiar, int powiekszenie = 1)
{
        moja_klasa *temp = moja_klasa gry [rozmiar + powiekszenie];

        if(temp == NULL)
        {
              cout << "Realokacja nie udana" << endl;
              return NULL;
         }

        for(int i = 0; i < rozmiar; i++)
            temp[i] = wsk[i];

        delete [] wsk;

        return temp;                 
}

Pozostało 580 znaków

2013-12-17 20:11
1

Takie cos to sie nawet nie ma prawa skompilowac. Juz pomijajac fakt, ze gry wystepuja kompletnie z czapy, to zwracasz adres do tablicy lokalnej (ktora zostanie nadpisana). Dodatkowo korzystasz z rozszerzenia kompilatora GNU (VLA) co jest wysoce niezalecane. W C++ 14 dopiero bedzie zdefiniowanie to w standardzie.
Jakas najprymitywniejsza forma realokacji moglaby wygladac tak:

template<typename T>
T* my_realloc(T* src, size_t old_size, size_t new_size) {
    if(!new_size) {
        return nullptr;
    }

    T* temp_array = new T[new_size];
    for(size_t i = 0; i < max(old_size, new_size); ++i) {
        temp_array[i] = src[i];
    }

    delete[] src;
    return temp_array;
}

http://ideone.com/Z9egXr

edytowany 1x, ostatnio: n0name_l, 2013-12-17 21:42
jak już nazywasz realloc (nie grow) to przynajmniej w komentarzach TODO uwzgłednij że new_size może być mniejszy od old_size - _13th_Dragon 2013-12-17 21:28

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0