thought:
say you had code such as this...
NOTE: using C...
Code:
object* factory(parameter1, parameter2, para....)
{
object* a = allocate memory;
if(!a)
return NULL;
a->member1 = allocate memory based on parameter1;
if(!a->member1)
{
free(a);
return NULL;
}
a->member2 = allocate memory based on parameter2;
if(!a->member2)
{
free(a);
free(a->member1);
}
/// etc................
return a;
}
error handling code is redundant... and continually grows longer....
solution 1:
Code:
void FAIL(object* obj)
{
free(obj->member2);
free(obj->member1);
// etc....
free(obj);
}
object* factory(parameter1, parameter2, para....)
{
object* a = allocate memory zeroed memory;
if(!a)
return NULL;
if(!(a->member1 = allocate memory based on parameter1))
{
FAIL(a);
return NULL;
}
if(!(a->member2 = allocate memory based on parameter2))
{
FAIL(a);
return NULL;
}
/// etc................
return a;
}
requires a specialized function... but it works and is cleaner...
solution 2:
Code:
object* factory(parameter1, parameter2, para....)
{
object* a = allocate memory zeroed memory;
if(!a)
return NULL;
if(!(a->member1 = allocate memory based on parameter1))
goto FAIL;
if(!(a->member2 = allocate memory based on parameter2))
goto FAIL;
/// etc................
return a;
FAIL:
free(a->member2);
free(a->member1);
// etc....
free(a);
return NULL;
}
cleaner requires no function... uses goto(OH NOES!!!!!)...
comments... suggestions? thoughts?