Kolokwium z obiektówki - kilka pytań z alokacji pamięci

0

Witajcie,

mam niedługo kolokwium i chciałbym się dowiedzieć kilku rzeczy, których nie ogarnąłem, a możliwe, że by się pojawiły na kolokwium. Jak ktoś zna odpowiedź na jakieś pytanie odpowiedź to bardzo proszę o pomoc! :D

  1. Będę miał za zadanie zrobić dynamiczne przydzielanie pamięci, a na początku będzie pojemność stosu w klasie ograniczyć dostępną pamięcią operacyjną.
    Jak zrobić takie ograniczenie? Bo do tej pory alokowałem pamięć tylko na jakąś ilość bajtów, a nie na całą dostępną pamięć ;/

  2. Jak w takim stosie miałoby wyglądać zwalnianie i alokowanie pamięci?
    Jakiś czas temu robiłem dynamiczne alokowanie pamięci na takiej zasadzie:

//alokacja pamięci
    for (i = 0; i < rozmiar; i++)
    {
        *(tab + i) = (int*)malloc(sizeof(int) * rozmiar);
    }

// jakies wypełnianie tablicy

//zwalnianie pamieci
    for (i = 0; i < rozmiar; i++)
    {
        free(*(tab + i));
    }

Na stosach nie działałem za wiele więc przydałaby się pomoc jak tę pamięć zwalniać.
Ogólnie powinno się pewnie też delete [] użyć ;/

Jak na coś jeszcze wpadnę to zapytam :)

0

W związku z tym, że to zadanie na studia to zakładam, że chodzi o naiwną implementację stosu w formie kolejki lifo, gdzie każdy node jest alokowany osobno.

  1. Pewnie masz próbować alokować via new do czasu, aż nie zostanie rzucony wyjątek std::bad_alloc/ewentualnie użyć std::nothrow i sprawdzać, czy dostajesz nullptr.
  2. Jeśli moje założenie jest prawdziwe, to masz osobno alokować/dealokować każdy element stosu.
0

@satirev: dokładnie też mi się tak wydaje, że dla każdego elementu musiałbym zaalokować tę pamięć. Czyli przy każdym dodaniu elementu - funkcja push() - alokuję pamięć dla nowego elementu

I tak teraz wpadłem na myśl. Przecież jak nadam pierwszemu elementowi pamięć na 2 bajty, to przy kolejnym push() zwiększę tą używaną pamięć dwukrotnie. A odgórne ograniczenie pamięci na całą dostępną pamięć nie jest potrzebne, bo się program wywali dopiero jak ten stos będzie tak duży, że pamięć się skończy. Dobrze myślę czy nie? Bo w zadaniu przykładowym z kolosa mamy informację, żę właśnie stos ma być ograniczony pamięcią która jest dostępna...

//konstruktor alokujący pamięć. 
Stack::Stack() 
{       int size = 2; //to powinno być w klasie, wiem.
	dane = (int*)malloc(size*sizeof(int));
}
void Stack::push(int n) 
{
        int newSize = (size*2);
	int* newDane = (int*)realloc(dane,newSize*sizeof(int));
	if (newDane!=NULL) 
	{
		dane=newDane;
	} 
	else
	{
		free(newDane);
		free(dane);
		
	}
}

Jakoś tak to powinno wyglądać?

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