Jak usuwać dynamiczne obiekty z pamięci?

dział ogólny

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez Cyfrowy Baron » środa, 20 stycznia 2010, 13:06

Nie mam i nie korzystam z obiektu Scintilla, nie mogę pomóc, gdyż to co się sprawdza w odniesieniu do większości obiektów, najwyraźniej nie działa w odniesieniu do Scintilla.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez polymorphism » środa, 20 stycznia 2010, 13:41

W wątku to ja tylko próbuje ustawić focus okna

A to nie prościej, sensowniej i przede wszystkim bezpieczniej użyć do tego timera okienkowego?

A odnośnie głównego wątku: w czym tworzysz te kontrolki? Chodzi mi o to, czy liczba kontrolek jest na sztywno ustalona, czy może jest zmienna, zależna od akcji użytkownika.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez Cyfrowy Baron » środa, 20 stycznia 2010, 13:49

A to nie prościej, sensowniej i przede wszystkim bezpieczniej użyć do tego timera okienkowego?


Czy przez timer okienkowy rozumiesz zdarzenie OnIdle, czy coś innego, gdyż ja bym sugerował zamiast timera właśnie to zdarzenie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez kurczez » środa, 20 stycznia 2010, 14:01

Problem z focusem już rozwiązałem.

w czym tworzysz te kontrolki? Chodzi mi o to, czy liczba kontrolek jest na sztywno ustalona, czy może jest zmienna, zależna od akcji użytkownika.


Jedna kontrolka jest statyczna a pozostałe dynamiczne zależą od akcji użytkownika.
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    Windows VistaFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez polymorphism » środa, 20 stycznia 2010, 15:01

Cyfrowy Baron napisał(a):Czy przez timer okienkowy rozumiesz zdarzenie OnIdle, czy coś innego, gdyż ja bym sugerował zamiast timera właśnie to zdarzenie.

Przez timer rozumiem np. VCL-owski TTimer.

Jedna kontrolka jest statyczna a pozostałe dynamiczne zależą od akcji użytkownika.

Czyli użytkownik może je usunąć, tak? Jeśli tak, jak zarządzasz wskaźnikami w tej tablicy?

No i pytanie zasadnicze: czy ta kontrolka działa bez zarzutu w innej (testowej) aplikacji.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez kurczez » czwartek, 21 stycznia 2010, 14:29

Co masz na myśli pisząc jak zarządzam wskaźnikami?
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    Windows VistaFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez polymorphism » czwartek, 21 stycznia 2010, 15:29

Masz tablicę ze wskaźnikami, i teraz pytanie jest takie: co się stanie ze wskaźnikiem wewnątrz tej tablicy w momencie, gdy kontrolka, na którą ów wskaźnik wskazuje, zostanie usunięta? Zostanie wyzerowany, czy może będzie wisiał?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez kurczez » czwartek, 21 stycznia 2010, 17:39

Aktualnie nie mam w programie jeszcze opcji usuwania kontrolek przez użytkownika, jedynie ich tworzenie.
Czyli tworzę kontrolkę a gdy zamykam program do wywołuje w zdarzeniu OnClose głównej formy:

Kod: Zaznacz cały
for (unsigned int i = 0; i < dnie; i++)
   delete dnM[i];


Niezależnie od użycia tego kodu problem i tak występuje.
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    Windows VistaFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez polymorphism » czwartek, 21 stycznia 2010, 18:50

Trudno coś sensownego napisać. Samo usuwanie wygląda OK, przy założeniu, że dnie jest poprawnie zainicjalizowana. Z drugiej strony pisałeś, że bez usuwania błąd także występuje, być może coś nie tak jest przy tworzeniu obiektów.

W zasadzie nie odpowiedziałeś na moje drugie pytanie odnośnie samej kontrolki.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez Witold » czwartek, 21 stycznia 2010, 19:44

Kurczez, napisałem programik na podstawie Twoich fragmentów kodów (tworzenie dynamiczne TScintilla, potem usuwanie w OnClose), podczas testów (na BCB6) nie miałem żadnych błędów.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    Windows XPOpera

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez Cyfrowy Baron » piątek, 22 stycznia 2010, 10:55

Przypuszczam, że w Turbo C++ nie ma CodeGuard, więc nie możesz tak sprawdzić co dokładnie wywołuje błąd.
W związku z tym proponuję być w tym programie wyłączył wszystkie bloki kodu, które nie są związane bezpośrednio z Scintillą, czyli wszelkie wątki, ustawianie focusa itp. pozostaw tylko kod odpowiedzialny za dynamiczne tworzenie obiektów. To pozwoli ustalić czy błąd wywołuje coś związanego ze Scintillą, czy może zupełnie coś innego. Inaczej będziesz się męczył z tym kodem nie wiedząc gdzie tak naprawdę masz szukać błędu. Błąd o którym piszesz może wywołać wiele czynników, a Ty przedstawiasz tutaj tylko wyrywki kodu, które same w sobie błędne nie są.

Nie musisz usuwać tego kodu ani zdarzeń. Kod w zdarzeniach możesz wyłączyć tak:

Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
/*

  kod...

*/
}




Liczba elementów tablicy dnie jest ograniczona do 128, ale w kodzie tworzącym dynamicznie obiekty nie ma ograniczenia, czyli po przekroczeniu liczby 127 program wciąż może tworzyć obiekty, powinieneś wprowadzić ograniczenie:

Kod: Zaznacz cały
if(dnie > 127) return; /* przerwanie dalszego wykonywania kodu, gdy osiągnięto maksymalna dozwoloną liczbę obiektów */
if (OpenDialog1->Execute())
{

   TabControl2->Tabs->Add(ExtractFileName(OpenDialog1->FileName));

   dnM[dnie] = new TScintilla(TabControl2);
   dnM[dnie]->Parent = TabControl2;
  // ....




Zakładam, że wiesz iż deklarując tablicę o rozmiarze 128 (TScintilla *dnM[128]) nie liczysz od 1 do 128 tylko od 0 do 127? Zmienna dnie na starcie powinna być ustawiona na 0, ważne jest być przed pierwszym użyciem tej zmiennej ustawił jej taką wartość.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez polymorphism » piątek, 22 stycznia 2010, 10:59

powinieneś wprowadzić ograniczenie:

Albo użyć vectora. Po co tworzyć sztuczne ograniczenia?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez Cyfrowy Baron » piątek, 22 stycznia 2010, 11:01

Po co tworzyć sztuczne ograniczenia?


Nie wiem, ale w kodzie to ograniczenie występuje:

Kod: Zaznacz cały
TScintilla *dnM[128] = {0};
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez kurczez » sobota, 23 stycznia 2010, 01:03

Będzie problem z zakomentowaniem wszystkiego bo program składa się z 21 modułów i około 30.000 linii kodu.
Jeżeli nie stworze dynamicznie żadnej kontrolki to błąd nie wyskakuje, więc co teoretycznie w moim kodzie może powodować taki błąd? Może to, że nie usuwam jakiś innych obiektów?

Ps. wiem jak się komentuje bloki i że tablice się ustawia o 1 większą, jako takie podstawy mam przyswojone :)

polymorphism: skoro Witoldowi działa to pewnie mi też by działało na "sucho".
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    Windows VistaFirefox

Re: Jak usuwać dynamiczne obiekty z pamięci?

Nowy postprzez Cyfrowy Baron » sobota, 23 stycznia 2010, 10:14

[...] tablice się ustawia o 1 większą, jako takie podstawy mam przyswojone :)


To akurat nieprawda. Tablice obiektów ustawiasz na dokładnie taką liczbę obiektów jakiej potrzebujesz, czyli tablica o rozmiarze 128 pomieści dokładnie 128 obiektów w zakresie od 0 do 127, czyli pierwszy element tablicy ma numer 0 (nie 1) a ostatni ma numer 127 (nie 128). Liczysz od 0 a nie od 1, nie można tutaj powiedzieć, że to jest o 1 więcej.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 11 gości

cron