alokacja pamięci: zmienna nie otrzymuje nowej tablicy

0

witam, mam dziwny problem z dynamicznym alokowaniem tablicy

otóż mam program w MFC, mam globalnie zadeklarowany wskaźnik na tablicę obiektów klasy "towary"
2 funkcje tego programu polegają na dodaniu i usunięciu elementu z tablicy

Oto one:

 towary *b = new towary[indeks];
   for (int i=0; i<indeks;i++)
   {
      b[i] = x[i];
   }
   delete[] x;
   towary *x = new towary[indeks+1];
   for (int i=0; i<indeks; i++)
   {
      x[i]=b[i];
   }
   delete []b;

dodanie
oraz

      towary *b = new towary[indeks-1];
      for (int i=0; i<asd; i++)
      {
         b[i] = x[i];
      }
      for (int i=asd; i<indeks-1; i++)
      {
         b[i] = x[i+1];
      }
      delete[] x;
      towary *x = new towary[indeks-1];
      for (int i=0; i<indeks-1; i++)
      {
         x[i]=b[i];
      }
      delete[] b;
      indeks--;
      refreshlisty();

usunięcie (asd jest to numer elementu którego należy skasować, indeks to jest aktualna wielkość tablicy, a operator= jest przeciążony, aby kopiować wszystkie parametry)

problem wygląda tak, że mimo, że te 2 funkcje są identyczne, przy
delete[] x;
funkcja dodająca działa, a w funkcji usuwającej element wywala mi błąd, po czym przekierowuje mnie do pliku dbgheap.c, linijka zamykająca "WINHEAP"

Windows has triggered a breakpoint in projekt.exe.

This may be due to a corruption of the heap, which indicates a bug in projekt.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while projekt.exe has focus.

The output window may have more diagnostic information.

Czy widać tu jakiś błąd? Z góry dzięki za odpowiedź.

EDIT// zapomniałem dodać, że tym wskaźnikiem który zadeklarowałem jest x

Wyciąg z debuga - HEAP[projekt.exe]: Heap block at 00A81C08 modified at 00A81C78 past requested size of 68

0

SCOPE Ci się zawinął, ew. Ty się zawinąłeś we scope'ach.

dragomirek napisał(a)

Oto one:

 towary *b = new towary[indeks];
   for (int i=0; i<indeks;i++)
   {
      b[i] = x[i];                                       ////// skad pochodzi ta zmienna X?
   }
   delete[] x;
   towary *x = new towary[indeks+1];     /// jeżeli wiesz z tym powyżej, to teraz PATRZ i MYŚL o tej linii
   for (int i=0; i<indeks; i++)
   {
      x[i]=b[i];                                       // a ta zmienna X, skad pochodzi?
   }
   delete []b;

i pytanie naprowadzające, w linii tuż przed "patrz i myśl" dealokujesz pewna tablice, zas w tej linii alokujesz pewna tablice. gdzie trafia wynik alokacji?

0

nie jestem w tym zbyt dużym ogarem, na razie dla mnie programowanie polega na tym, że coś jest i działa, ale jak to działa to już nie ważne (czyli typowy początkujący)

mógłbyś mi powiedzieć gdzie trafia wynik alokacji? w to samo miejsce gdzie wcześniej? (bo wcześniej zadeklarowałem wskaźnik x, potem usunąłem tablicę, ale wskaźnik chyba pozostaje wciąż bez zmian, więc powinno to trafiać w to samo miejsce)

0

w linijce oznaczonej 'PATRZ' tworzysz NOWA ZMIENNA, lokalna, która zasłania tamto globalne X. od tego momentu w dół tej funkcji ciagle operujesz na lokalnej zmiennej, ktorej wynik wyparowuje w momencie skonczenia sie funkcji. NIC nie trafia na zewnatrz do globalnej zmiennej. Funkcja wiec usuwa globalna tablice, ale nie odtwarza jej i w globalnej zmiennej zostaje śmiec-pointer, ktory potem wywala Ci program

rozwiazanie jest proste - po "delete[] x;" wywal napis 'towary *', niech zostanie samo x=new..

0

to jednak nie było przyczyną problemu, zmieniłem całkowicie koncepcję programu i wszystko działa

mimo to dzięki za uświadomienie mnie w tej sprawie, teraz już rozumiem czego nie robić w przyszłości

do zamknięcia

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