O_o
You should employ the "weak resource pattern" in C (Example code is included because I don't think this is C++ code.) or "RAII" pattern in C++.
I didn't have any time for the code; the code is garbage, but the idea is represented.
This code is not a valid use of `goto'; the resources are simple enough to move to components.
Soma
Code:
systemSnapshot * createSnapshot()
{
// createArray should now return null on failure
systemSnapshot * s;
s = ( systemSnapshot * ) createArray( NULL, 1, sizeof( systemSnapshot ), zeroArray ) ) );
if (s) {
s->processIds = ( DWORD * )queryAllProcessIds( &s->arraySize ) ) );
}
return s;
}
void destroySnapshot(systemSnapshot * f)
{
if ( snapshot->processIds ) free( f->processIds );
if ( snapshot->processNames )
{
for ( int i = 0; i < snapshot->arraySize; ++i ) free( snapshot->processNames[i] );
free( snapshot->processNames );
}
if (s->processNames){
for ( int i = 0; i < snapshot->arraySize; ++i )
snapshot->processNames[i] = ( char * )getProcessNameFromHandle( processHandles[i], false );
)
}
free( snapshot );
}
HANDLE * queryProcessHandlesFromIds(systemSnapshot * f)
{
if (f) {
return ( HANDLE * )queryProcessHandlesFromIds( snapshot->processIds, snapshot->arraySize )
}
return NULL;
}
void destroyProcessHandlesFromIds(HANDLE * f)
{
if (f)
{
for ( int i = 0; i < snapshot->arraySize; ++i ) CloseHandle( processHandles[i] );
free( processHandles );
}
}
systemSnapshot * createSystemSnapshot()
{
systemSnapshot * snapshot = createSnapshot(/**/);
HANDLE * processHandles = queryProcessHandlesFromIds(/**/);
if (snapshot && processHandles && (snapshot->processNames = ( char ** )createArray( NULL, snapshot->arraySize, sizeof( char * ), zeroArray ))) {
for ( int i = 0; i < snapshot->arraySize; ++i )
snapshot->processNames[i] = ( char * )getProcessNameFromHandle( processHandles[i], false );
} else {
destroyProcessHandlesFromIds(/**/);
destroySnapshot(/**/);
}
}