mesajflaviu wrote:
Faza tare e ca in mod Release merge brici, si mie imi convine ca doar produsul final e in Release mode ... dar asta e cu doua taisuri, cine stie de ce probleme dau mai incolo ?!
E cu multe taisuri...
In release "merge brici" pentru ca in release assert-urile sar din schema.
Macro-uri gen ASSERT, ASSERT_VALID si altele din seria lor, sunt definite cam asa:
Code: Select all
#ifdef _DEBUG
// ...
#define ASSERT(f) \
do \
{ \
if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) \
AfxDebugBreak(); \
} while (0) \
#define ASSERT_VALID(pOb) (::AfxAssertValidObject(pOb, THIS_FILE, __LINE__))
// ...
#else
// ...
#define ASSERT(f) ((void)0)
#define ASSERT_VALID(pOb) ((void)0)
// ...
#endif
Rostul lor este sa traga de urechi un programator atunci cand face greseli de programare.
Chiar daca in debug dam ignore si nu crapa imediat sau in release pare ca "merge brici" nu inseamana ca totu-i OK.
De exemplu, cineva "grabit" scrie...
Code: Select all
void CMySDIDoc::Serialize(CArchive& ar)
{
// just demo, loading image from a bitmap file
if(ar.IsLoading())
{
CString strFileName = ar.m_pDocument->GetPathName();
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, strFileName,
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_bitmap.Attach(hBitmap);
}
}
...la apeluri consecutive, in debug o sa sara un minunat "Debug Assertion Failed".
Daca da "Ignore" , aparent merge.
La fel, in release o sa para ca merge si mai si.
Problema e ca nu se stie pana cand... (de cele mai multe ori crapa in release la client, si nu stie de ce)
Daca-i baiat destept si da "Retry", atunci vede asta:
Code: Select all
BOOL CGdiObject::Attach(HGDIOBJ hObject)
{
ASSERT(m_hObject == NULL); // only attach once, detach on destroy
//...
}
"Ahaaaa!... parca-parca mi-a spus cineva ca trebuie golit cosul, altfel mai devreme sau mai tarziu da pe dinafara.
Deci, corecteaza:
Code: Select all
void CMySDIDoc::Serialize(CArchive& ar)
{
// just demo, loading image from a bitmap file
if(ar.IsLoading())
{
if(NULL != m_bitmap.GetSafeHandle())
{
m_bitmap.DeleteObject(); // detach handle and destroy the GDI object
}
// ... all the rest like above
In concluzie ASSERT-urile sunt cu folos si nu trebuie ignorate.
Ca unii programatori le folsesc aiurea (de exemplu testeaza condititi la run-time) asta-i alta mancare de peste.
Dar in alea din MFC poti sa ai incredere, sunt bine puse.
In cazul nostru, e destul de greu sa-mi dau seama unde e de fapt buba.
Pentru ca am testat pe acelasi proiect, ambii cu VS6.0 si nu cred ca problema are ceva de-a face cu sistemul de operare, urmatoarea cauza la care ma gandesc este lipsa service pack-ului la tine.