Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 15. listopad 2009, 13:52:03 Předmět: |
|
|
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 |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 15. listopad 2009, 15:07:50 Předmět: |
|
|
rezna napsal: |
exit - mno a co? - stejne jak se ukonci program tak se vsechno uvolni  |
jenže mě to pak strhne 30procent z celkového počtu získaných bodů.. takže nemůžu říct "no a co" .
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 15. listopad 2009, 17:38:05 Předmět: |
|
|
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 |
|
 |
MD

Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 15. listopad 2009, 18:05:41 Předmět: |
|
|
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 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 |
|
 |
bolejt

Založen: 02. 05. 2009 Příspěvky: 45
|
Zaslal: 15. listopad 2009, 19:19:05 Předmět: |
|
|
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čů...  _________________ Ball ball8; |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 15. listopad 2009, 19:29:02 Předmět: |
|
|
MD> Na tohle je asi lepší valgrind nebo přetížit standardní CRT knihovnu. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 15. listopad 2009, 22:01:44 Předmět: |
|
|
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 16. listopad 2009, 09:00:43 Předmět: |
|
|
Houp - tak jeste jednou - 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 |
|
 |
Alenka
Založen: 28. 07. 2007 Příspěvky: 49
|
Zaslal: 20. listopad 2009, 18:04:20 Předmět: |
|
|
Konecne po dlouhe dobe pro me uzitecne vlakno na foru Ceskych Her 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  |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
|
Návrat nahoru |
|
 |
johnnash
Založen: 30. 07. 2007 Příspěvky: 80
|
Zaslal: 25. listopad 2009, 17:54:00 Předmět: |
|
|
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 ) |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 25. listopad 2009, 18:24:45 Předmět: |
|
|
no tak mi to nedalo - 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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 26. listopad 2009, 00:30:51 Předmět: |
|
|
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 |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 26. listopad 2009, 09:16:11 Předmět: |
|
|
Jo hlavně když se ani nenamáhá dát ukázkový kód. _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
|