realokacja pamięci zarezerwowanej operatorem new

0

Witam.
Mam takie proste pytanko:
W jaki sposób można zwiększyć przydział pamięci alokowany za pomocą operatora new?
Czy funkcja realloc zadziała? Jeśli tak, to czy mogę potem taki obszar zwolnic operatorem delete?

0

O co chodzi "zwiększyć przedział"??

1

nienienie.

Operator new ma to do siebie, że wywołuje konstruktor danej klasy, a taki konstruktor może tworzyć różne powiązania pomiędzy pamięcią. Zastosowanie realloc może spowodować zerwanie tych powiązań i nieprzewidziany sposób działania programu. Poza tym ze swojej definicji klasy mają z góry ustalony rozmiar.
realloc może zwiększyć przedział pamięci bez kopiowania i wtedy masz szczęście, ale prze fragmentacji pamięci to najprawdopodobniej po prostu alokuje pamięć w innym miejscu i skopiuje zawartość z poprzedniego miejsca.
realloc możesz korzystać jedynie w przypadku, gdy stosujesz malloc itp.

0

mysle ze nie o klase tu chodzi, bo klasy nie potrzebuja zmiany ilosci zarezerwowanej pamieci, chyba ze tablica/lista/... klas

w przypadku struktur/tablic/ogolnie buforow pamieci wszystko zalezy od kompilatora. new i delete moga rownie dobrze wspolpracowac malloc/realloc/free jak i wykrzaczac sie kompletnie. sprawdz sam, czy nie masz po kombinacjach memleakow, albo czy ci sie po prostu program nie wywali. albo w ogole nie uzywaj new/delete tylko malloc/realloc/free (btw realloc mozesz uzyc w zastepstwie i malloc i free)

0

Stroustrup w swojej książce pisze, żeby nie mieszczać malloc/free/realloc z new/delete. Rzecz z cyklu "może działać ale nie musi i jest nie przenośne".

0

Jeśli chodzi o tablicę to na pewno zadziała metoda przepisania zawartości to jakiegoś bufora, skasowanie oryginału, utworzenie nowego, większego obiektu, przepisanie zawartości z bufora i wyczyszczenie bufora.
Trochę roboty ale działa i nie ma wycieków;)

1

o_O'
A nie prosciej uminąć w ogóle ten "bufor"?
Tworzysz nową, większą tablicę, kopiujesz z tej twojej pierwotnej do tamtej, jak wszystko się udało to kasujesz tą pierwotną i zwracasz wskaźnik na tą nową.

0

Jak kto woli ;]

0
Shalom napisał(a)

o_O'
A nie prosciej uminąć w ogóle ten "bufor"?
Tworzysz nową, większą tablicę, kopiujesz z tej twojej pierwotnej do tamtej, jak wszystko się udało to kasujesz tą pierwotną i zwracasz wskaźnik na tą nową.

dokladna definicja realloc, z pominieciem jednej rzeczy. jesli za zaalokowanym obszarem jest ciagle i nie przypisane miejsce na stercie, realloc powieksza zaalokowany obszar bez tworzenia nowego i kopiowania danych. a to potrafi oszczedzic i czas i pamiec na czas ewentualnego kopiowania

0

@up Wiem ;) ale chodziło mi o "sposób" który podała osoba nad moim postem, który efektywnością nie grzeszy ;)

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