Prosim, zabijte me.Mam muj program (na Windows XP + MSVC 2008 Express) a pada mi s touhle hlaskou:
HEAP[insight3d.exe]: HEAP: Free Heap block 293c770 modified at 293c780 after it was freed
Windows has triggered a breakpoint in insight3d.exe.
Dela to celkem nahodne:
- Casto pri nejake interakci s GUI (jako GUI knihovnu pouzivam Agar, ale neni to zas tak dulezite). Vetsinou mi pak Visual Studio zustane viset uvnitr funkce z te GUI knihovny.
- To same se mi ted zacalo dit i po napsani jedne funkce, ktera celkem intenzivne alokuje a dealokuje pamet (ale ne moc sofistikovane, nevypada to, ze tam mam overflow). V tomhle pripade to skonci provedenim free().
Pouzivam hodne (cca 10) cizich knihoven a hodne hodin uz na to nemuzu prijit. Tipuju, ze nejpravdepodobnejsi jsou dve moznosti:
- nektera z tech cizich knihoven prepisuje neco, co nema
- linkuju dohromady spatne verze knihoven (= zkompilovane pod ruznymi runtime)
Da se tohle nejak rozumne vydebugovat? Muzu u knihovny (.lib nebo .dll) zjistit, s kterym runtimem je zkompilovana (LIBCMT.lib nebo MSVCRT.lib)?
Co vim, tak clovek nesmi pouzivat dohromady knihovny zkompilovane s /MD a /MT - musi to byt jednotne. Kdyz se to pomicha, tak jednak linker zahlasi warning, ze spolu koliduji MSVCRT.lib a LIBCMT.lib a taky to muze odlitavat. Prosel jsem vsechny pouzivane knihovny a bud je prekompiloval nebo se alespon podival, co autori tvrdi. Ted bych tedy mel mit vsechno kompilovane jako "Multi-thread DLL" (/MD). Ale porad mi to pada.
Asi nejzavaznejsi dotaz: Muzu vzit knihovny (.lib, .dll) zkompilovane pod MSVC 2005 a pouzivat je v MSVC 2008 Express (tedy asi se muze stat, ze treba knihovny budou zkompilovane spolu s MSVCRT70.lib a hlavni program s MSVCRT80.lib). Pritom pokud nejaka knihovna alokuje pamet, tak ji uvolni jen ta sama knihovna - nikoliv jina. |