Dynamicznie tworzone kontrolki nadpisują pamięć aplikacji

0

Tworzę dynamicznie kontrolki formatki (około 20). Po utworzeniu którejś tam z kolei obserwuję w trybie debugowania, że zmienia mi się zawartość obserwowanych zmiennych na 'krzaki'. Oczywiście aplikacja 'wysypuje się' wcześniej czy później w powodu błędnego alokowania obiektów w pamięci. Używam Borland Buildera 3. Próbowałem w opcjach projektu zmieniać 'stack size' oraz 'heap size' podwajając te wartości, ale nie przynosi to rezultatu.

0

to by znaczylo ze te zmienne ktore ogladasz to sa urwane, niewyzerowane wskazniki pokazujace na pamiec ktora juz byla zwolniona, nie byla wyczyszczona i ciagle zawiera stare dane na ktore patrzysz sadzac ze to sa twoje dane.. a to smieci.. i wlasnie obserwujesz jak ta pamiec zostaje przydzielona czemus innemu..

0

Monitoruję zmienne o zasięgu globalnym, które na pewno nie są zwalniane w tej części kodu. Poza tym zauważyłem jeszcze inną dziwną rzecz: jeśli pominę utworzenie tej kontrolki (TLabel), reszta kontrolek tworzy się bez problemów i pamięć uprzednio przydzielona zmiennym nie jest nadpisywana. Sprawa jest o tyle dziwna, że po 'feralnej' TLabel tworzę jeszcze kilka innych tego typu, i wszystko jest OK. W sumie na formatce jest 8 innych TLabel i ich utworzenie nie ma destrukcyjnego wpływu na pamięć.

0

Zamieść jakiś kod będzie łatwiej ci pomóc :-)

0

Oto najistotniejsze fragmenty kodu:
Struktura grupy kontrolek:

typedef struct
{
  TPanel *panel;
  TShape *zarys;
  TLabel *nazwa,
         *piny,
         *rezyst;
} ST_Ikona;

deklaracja tablicy przechowującej struktury
ST_Ikona *Ikony = new ST_Ikona[Projekt.ilosc_ikon];

fragment feralnego kodu:

  for (int i = 0; i < Projekt.ilosc_ikon; i++)
  {
    Ikony[i].panel = new TPanel(Owner);
    Ikony[i].panel->Width = PANEL_ROZM;
    Ikony[i].panel->Height = PANEL_ROZM * 1.5;
    itd... - dalsze atrybuty

    Ikony[i].zarys = new TShape(Owner);
    Ikony[i].zarys->Parent = Ikony[i].panel;
    itd... - dalsze atrybuty

    Ikony[i].nazwa = new TLabel(Owner);
    Ikony[i].nazwa->Parent = Ikony[i].panel;
    Ikony[i].nazwa->Color = Ikony[i].panel->Color;
    itd... - dalsze atrybuty

*   Ikony[i].piny = new TLabel(Owner);
    Ikony[i].piny->Parent = Ikony[i].panel;
    Ikony[i].piny->Color = Ikony[i].zarys->Brush->Color;
    itd... - dalsze atrybuty

    Ikony[i].rezyst = new TLabel(Owner);
    Ikony[i].rezyst->Parent = Ikony[i].panel;
    Ikony[i].rezyst->Color = Ikony[i].panel->Color;
    itd... - dalsze atrybuty
  }

Ta pętla ma mieć 4 iteracje. Już w 3 iteracji następuje nadpisanie atrybutów wcześniej wygenerowanych obiektów tuż po wykonaniu linii (zaznaczonej na listingu gwiazdką):
Ikony[i].piny = new TLabel(Owner);
Zarówno licznik iteracji 'i' jak i parametr Projekt.ilosc_ikon mają cały czas poprawne wartości.

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