Hi everyone,
please consider this (maybe frequent) C/C++ code:
/* GLOBALS (or class members, or whatsoever...) */
SomeType1 * pT1 = 0;
SomeType2 * pT2 = 0;
/* ... */
SomeTypeN * pTN = 0;
bool MyInitFuncion(void) {
pT1 = new SomeType1[/* ..size1.. */];
if (!Check_Or_Use_T1(pT1)) {
return (false);
}
pT2 = new SomeType2[/* ..size2.. */];
if (!Check_Or_Use_T2(pT2)) {
delete pT1;
return (false);
}
/* ... */
/* ... */
/* ... */
pTN = new SomeTypeN[/* ..sizeN.. */];
if (!Check_Or_Use_TN(pTN)) {
delete pT1;
delete pT2;
/* ... */
/* ... */
/* ... */
return (false);
}
return (true);
}
As you can see, this code, thus it seems robust (well, at least to me),
could be error-prone and quite unpratical.
Here is the most-seen solution i've found:
bool MyInitFuncion(void) {
pT1 = new SomeType1[/* ..size1.. */];
if (!Check_Or_Use_T1(pT1)) {
goto my_error;
}
pT2 = new SomeType2[/* ..size2.. */];
if (!Check_Or_Use_T2(pT2)) {
goto my_error;
}
/* ... */
/* ... */
/* ... */
pTN = new SomeTypeN[/* ..sizeN.. */];
if (!Check_Or_Use_TN(pTN)) {
goto my_error;
}
return (true);
my_error:
delete pT1;
delete pT2;
/* ... */
/* ... */
/* ... */
delete pTN;
return (false);
}
But "goto"... quite ugly although functional :P
Another solution could be to group each runtime allocated pointer (object or array...)
into a class/struct and then call a specific free funcion:
void Clean(MyGlobalStruct * pGlobal) {
delete pGlobal->pT1;
delete pGlobal->pT2;
/* ... */
/* ... */
/* ... */
delete pGlobal->pTN;
}
bool MyInitFuncion(void) {
my_global_struct->pT1 = new SomeType1[/* ..size1.. */];
if (!Check_Or_Use_T1(my_global_struct->pT1)) {
Clean(my_global_struct);
return (false);
}
my_global_struct->pT2 = new SomeType2[/* ..size2.. */];
if (!Check_Or_Use_T2(pT2)) {
Clean(my_global_struct);
return (false);
}
/* ... */
/* ... */
/* ... */
my_global_struct->pTN = new SomeTypeN[/* ..sizeN.. */];
if (!Check_Or_Use_TN(my_global_struct->pTN)) {
Clean(my_global_struct);
return (false);
}
return (true);
}
Consider these examples with explanatory purpose only (substitute operator new with malloc()
and delete with free() or every language-specific memory allocation, though the alloc/free code can be seen as generic initialize/finalize code).
Some opinions?
Thanks :)
[Edited by - CoreMeltdown on July 17, 2005 5:51:54 AM]