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

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??

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

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ć??

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.

1

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

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ć.

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;                 
}
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

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