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??
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
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ć??
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.
Korzystać możesz swobodnie, byle malloc,realloc,free
odnosili się wyłacznie do typów prostych (chyba że próbujesz przeciążyć new)
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ć.
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;
}
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;
}