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.
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..
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ęć.
Zamieść jakiś kod będzie łatwiej ci pomóc :-)
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.