Sulla scia del bug heartbleed , OpenSSL è stato giustamente criticato per l'utilizzo del proprio freelist. Con% -cos% co_de semplice, l'errore sarebbe stato quasi certamente trovato molto tempo fa.
Tuttavia, alcuni tipi di wrapping di malloc sono in realtà molto comuni. Ad esempio, quando ho un oggetto grande che possiede molti piccoli oggetti di dimensioni fisse, li alloco spesso da un array.
/* BigObj is allocated with 'malloc', but LittleObj using 'alloc_little'. */
typedef struct {
/* bigObj stuff here */
int nlittle;
LittleObj littles[MAX_LITTLE];
} BigObj;
LittleObj *alloc_little(BigObj *big)
{
if(big->nlittle == MAX_LITTLE)
return NULL;
return = big->littles + big->nlittle++;
}
malloc
è più veloce di alloc_little
, ma la ragione principale è la semplicità. Non c'è nessun malloc()
da chiamare, perché free_little
rimane valido fino a quando il LittleObjs
non viene distrutto.
Quindi questo è un anti-pattern? In tal caso, posso mitigare i rischi o dovrei semplicemente abbandonarlo? Domande simili vanno per qualsiasi tipo di pool di memoria, come GNU Obstacks e BigObj
utilizzato in Samba.