Dynamiczny przydział i zwalnianie pamięci

0

Witam

Mam już napisany program w którym dynamicznie przydzielam pamięć do tablicy, i w każdym cyklu pętli ostatnia komórka jest nie używana. Pomyślałem, po co ma być zajmowane miejsce w pamięci gdy nie jest mi ono potrzebne? No więc pytanie:
Czy taka technika jest poprawna?

int *tab = new int[n];

for(int i=0; i<n; ++i)
{
  ...
  delete t[--n];
}
0

Z mojej wiedzy wynika że nie da się usunąć pojedynczej komórki... Usuwasz cała tablice albo nic. Więc możesz robić nową tablice o rozmiarze o 1 mniejszym i skasować stara, co jest BARDZO nieoptymalne i niewydajne, ożesz zastosować wektory lub listy.

http://www.cppreference.com/wiki/stl/vector/start

Możesz dodawać i usuwać elementy bez martwienia się o zarządzanie pamięcią.

0
lukasz93 napisał(a)

Witam
Czy taka technika jest poprawna?

int *tab = new int[n];

for(int i=0; i<n; ++i)
{
  ...
  delete t[--n];
}

Czym w ogóle jest "t"? Czym jest "n"? Ani jedno, ani drugie nie ma żadnej deklaracji w kodzie, który podałeś.
Na pewno dynamiczne zmniejszanie ogranicznika pętli aż prosi się o błędy. Szczególnie jeżeli jest to efekt uboczny dostępu do indeksu. Popatrz sobie na warunek pętli i wyobraź sobie co się stanie jeżeli przed wejściem do niej zmienna n będzie równa 1. Poza tym wykorzystasz tylko połowę początkowych indeksów w tablicy utworzonej na początku.
No i na koniec pomyśl po co przydzielać pamięć do czegoś co nie będzie Ci potrzebne.

0

Nie, chyba ze alokujesz te komórki pojedynczo.

0

Jeśli chodzi o kod to nie chodziło mi o szczegóły tylko o ogół, jak ta sytuacja wygląda.

Rezerwuje pamięć bo jest mi potrzebna, ale w czasie wykonywania algorytmu, jest potrzebne coraz mniej. Tablica jest bardzo wygodna, bo operuje na jej indeksach.

Hmm, a dało by się zrobić tak żeby stworzyć tablice wskaźników na wskaźniki, dla których zarezerwuje pamięć i potem odwołując się do komórki tablicy np. zwalniać pamięć z wskazywanego przez nią wskaźnika elementu?

Jakby to zaimplementować...

int **t = new int*[n];

for(int i=0; i<n; ++i)
  t[i] = new int;

Teraz chyba bym sobie mógł spokojnie zwalniać pamięć w ten sposób:

delete t[i];

Tak przy okazji nasunęło mi się kilka pytań... Tablica wskaźników zawiera adresy i długość wskazywanego obszaru pamięci. Ale na te adresy też przecież pamięć jest potrzebna? Czy miejsce w pamięci na wskaźniki jest tak samo alokowane jak miejsce np. na typ int?

W każdym razie chyba lepsze będzie to rozwiązanie z tablicą wskaźników na wskaźniki i zwalnianie pamięci z nieużywanych w danym czasie elementów, by na końcu zwolnić pamięć z całej tablicy, niż trzymać dane bezpośrednio w dynamicznej tablicy cały czas je przechowując nawet gdy nie są już potrzebne.

Co o tym sądzicie?

0

Mam jeszcze jeden problem. Powyższą technikę chciałem zastosować do tablicy dwuwymiarowej, ale coś jest nie tak.
Program się kompiluje jednak wywala błąd w konsoli: "This application has requested the Runtime to terminate it in an unusual way.". Kompilator MingW, IDE Code::Blocks.

Kod przydzielenia pamięci:

bool ***tablica = new bool **[y];
for(int i = 0; i < y; ++i)
{
    tablica[y] = new bool *[x];
    for(int j = 0; j < x; ++j)
        tablica[i][j] = new bool;
}

Co jest nie tak?

0
tablica[y] = new bool *[x];

Indeks y.

0
0x666 napisał(a)
tablica[y] = new bool *[x];

Indeks y.

Wielkie Dzięki! :)

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