.[ ČeskéHry.cz ].
Detekce neuvolněných bloků
Jdi na stránku Předchozí  1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Ladis



Založen: 18. 09. 2007
Příspěvky: 1536
Bydliště: u Prahy

PříspěvekZaslal: 15. listopad 2009, 13:52:03    Předmět: Odpovědět s citátem

No tak v main() je to už jedno, jestli dáš return nebo exit (takže použij return). A ano, je to tak správně, pošleš výjimku a v main() si ji zachytíš a žádný cizí text ti nevypíše.

Ad nepotřeba uvolňování prostředků na konci, systém se o to postará: Záleží jaký systém, ale Windows s tím má občas problémy. Např. po ukončení aplikace, kdy už nemá proces ve Správci úloh, zůstane občas uzamčený nějaký soubor (pro pokročilejší uživatele je tak nutností utilita Unlocker). Nebo na mým počítači po nainstalování SP2 do Visty se systém nedokáže ukončit (po ukončení Windows nepošle BIOSu příkaz vypnout/reboot, takže BIOS hledá další bootable medium - podle fór se to děje více lidem s SP2, ale z různých důvodů), když ukončím uTorrent s probíhajícím stahováním. Pokud stahování dojede nebo dám stahování ručně Stop, tak to funguje.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 15. listopad 2009, 15:07:50    Předmět: Odpovědět s citátem

rezna napsal:
exit - mno a co? - stejne jak se ukonci program tak se vsechno uvolni Smile


jenže mě to pak strhne 30procent z celkového počtu získaných bodů.. takže nemůžu říct "no a co" Smile.

bolejt:zatím se snažím a i celkem to jde, jsem zvědav, co přijde. (mám zatím ztrátu na dvou úlohách dohromady cca 0.6 bodu)
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 15. listopad 2009, 17:38:05    Předmět: Odpovědět s citátem

MD napsal:
@Eosie: Jeste by mne zajimalo, jak chces rucne detekovat memory leaky v cizich dll? Vzdyt ty muzou mit vlastni heap a tam pak new delete napichnes tezko. A staci k tomu aby byly prelozeny pod jinou verzi C++ runtimu, pod jinym prekladacem, pod jinym jazykem.. Nebo to fakt jde?


Můžeš si zajistit, aby tvoje vlastní dll knihovny linkovaly k nějaké hlavní dll, která detektor obsahuje, ale rozhodně bych to nedělal u cizích dll (pokud se nechceš hrabat v jejich kódu).

Namísto přemýšlení, jak detekovat leaky, radši používejte takové mechanismy, aby k nim nedocházelo (např. Resouce Acquisition Is Initiazation). Memory leak jde detekovat snadno, ale najít všechny resource leaky už vyžaduje dost usílí (neuvolní ho ani GC).

Co se týče těch výjimek a exit, měl jsem v minulosti docela problém s nevoláním destruktorů. Při psaní objektů se vždy počítá s tím, že se destruktor jednou zavolá a tudíž jeho nezavolání může mít vliv na korektnost programu. Pokud chcete násilně ukončit program, použijte abort(), jinak pouze výjimky.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
MD



Založen: 29. 07. 2007
Příspěvky: 437
Bydliště: Praha

PříspěvekZaslal: 15. listopad 2009, 18:05:41    Předmět: Odpovědět s citátem

Tohle uz bude asi trochu OT, ale jen vysvetlim proc me zajimaly ty leaky u cizich dll. Jde o to, ze jsme vyvijeli software a ted tester nahlasil, ze se nejak zvysuje spotreba pameti treba o 40kb, ze tam tedy mame memory leak.

Leak jsme nasli, jenomze ne vsechen, snizili jsme to ze 40 treba na 3kb. Bohuzel se mi nepodarilo ukecat testera ani sefa, ze ted uz by to mohlo byt OK Wink V te aplikaci bezi spousta komponent tretich stran a bije se to tam hlava nehlava, takze jsem potreboval najit dukaz, ze ted ta chyba je uz u nekoho jineho. Pouzivali jsme jak vlastni detekci tak myslim i nejake programky, detaily uz jsem davno zapomnel a myslim ze jsme nakonec stejne vsechno nenasli.
_________________
- play with objects - www.krkal.org -
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
bolejt



Založen: 02. 05. 2009
Příspěvky: 45

PříspěvekZaslal: 15. listopad 2009, 19:19:05    Předmět: Odpovědět s citátem

trochu jsem rozvedl svou myšlenku a udělal jsem "ugly hack" pro C++ kód, který používá exit(returnCode). prakticky to nemá využití, jen jsem byl zvědav, jestli je to možné...
http://nopaste.ceske-hry.cz/222774

Houp: tak ať ti to vydrží. už teď úlohy začínají být zajímavější, z minulého roku jsem slyšel, že ty poslední úlohy dělalo jen pár sebemrskačů... Very Happy
_________________
Ball ball8;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 15. listopad 2009, 19:29:02    Předmět: Odpovědět s citátem

MD> Na tohle je asi lepší valgrind nebo přetížit standardní CRT knihovnu.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 15. listopad 2009, 22:01:44    Předmět: Odpovědět s citátem

já k těm knihovnám doplním mudflap(to používá vyučující na kontrolu), ale nějak se mi to nepodařilo rozchodit na Win
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 16. listopad 2009, 09:00:43    Předmět: Odpovědět s citátem

Houp - tak jeste jednou Wink - vyprdni se na Code::Blocks a pouzij poradnej nastroj

VC++ i v EE edici umi detekovat neuvelnenou pamet - v debugu ji nakonec vypise - alokace si cisluje a pokud nastavis globalni promennou na cislo alokace z vypisu tak ti dokonce zastavi pri one alokaci kod a ty to muzes overit...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Alenka



Založen: 28. 07. 2007
Příspěvky: 49

PříspěvekZaslal: 20. listopad 2009, 18:04:20    Předmět: Odpovědět s citátem

Konecne po dlouhe dobe pro me uzitecne vlakno na foru Ceskych Her Wink Takze diky Houpovi, ktery me na nej upozornil a reznovi, ktery vyresil problem s mudflapem, ktery uz (doufam) nebudu muset pouzivat. Jdu zkusit jak si s memory leaky poradi VS Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 20. listopad 2009, 21:43:53    Předmět: Odpovědět s citátem

http://msdn.microsoft.com/en-us/library/e5ewb1h3(VS.71).aspx
http://msdn.microsoft.com/en-us/library/x98tx3cf(VS.80).aspx
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
johnnash



Založen: 30. 07. 2007
Příspěvky: 80

PříspěvekZaslal: 25. listopad 2009, 17:54:00    Předmět: Odpovědět s citátem

Tak se musim podelit s jednou zajimavou vlastnosti(bugem) ve VS2008.
Pokud mam tridu
kód:

class NejakaTrida
{
private:
       normalni promenne;
       staticke promenne;
       int nejakaPromenna;
       ....

Mam pole trid NejakaTrida, v metode priradim do nejakaPromenna treba nulu, a dojde k poruseni haldy. Zrejme si Visual Studio nejak spatne usporada pamet a povazuje nestatickou promenou za statickou a pri zapisu dojde k poruseni haldy. (Nebo je to nejaka moje zakladni neznalost C++, ze za statickyma promenyma uz nic nemuze byt, coz snad ne Laughing)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 25. listopad 2009, 18:19:05    Předmět: Odpovědět s citátem

johnnash

http://nopaste.ceske-hry.cz - postni presny kus kodu
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 25. listopad 2009, 18:24:45    Předmět: Odpovědět s citátem

no tak mi to nedalo Smile - tohle funguje

kód:
#include <stdio.h>
#include <stdlib.h>

struct Foo
{
private:
   int A;
   int B;
   static int C;
   static int D;
   int E;

public:
   void SetE(int E) {
      this->E = E;
   }
};

int main(int argc, char ** argv)
{
   Foo         arr_1[10];
   Foo*      arr_2[10];

   for (int i = 0; i < 10; i++) {
      arr_2[i] = new Foo();
   }

   for (int i = 0; i < 10; i++) {
      arr_1[i].SetE(i);
   }

   for (int i = 0; i < 10; i++) {
      arr_2[i]->SetE(i);
   }

   return 0;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 26. listopad 2009, 00:30:51    Předmět: Odpovědět s citátem

Zřejmě je vždycky jednodušší svést problém na všechno ostatní jen ne na toho týpka před klávesnicí.
_________________
AMD Open Source Graphics Driver Developer


Naposledy upravil Marek dne 26. listopad 2009, 16:09:25, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1536
Bydliště: u Prahy

PříspěvekZaslal: 26. listopad 2009, 09:16:11    Předmět: Odpovědět s citátem

Jo hlavně když se ani nenamáhá dát ukázkový kód.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3  Další
Strana 2 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna