Capisco che le allocazioni di memoria effettuate in una DLL e successivamente liberate in un'altra possono causare problemi di sorta, in particolare per quanto riguarda il CRT. Questi tipi di problemi sono particolarmente problematici quando si tratta di esportare container STL. Abbiamo sperimentato questo tipo di problemi prima (durante la scrittura dei plugin personalizzato Adobe che collegavano con le nostre biblioteche) e abbiamo lavorato intorno a questi problemi definendo la nostra allocatore che usiamo in tutti i nostri contenitori, ad esempio:Allocazione di memoria e deallocazione attraverso i contorni delle DLL
typedef std::vector < SessionFields,
OurAllocator <SessionFields> >
VectorSessionFields;
typedef std::set < SessionFields,
std::less <SessionFields>,
OurAllocator <SessionFields> >
SetSessionFields;
Questo ha funzionato bene durante il passaggio di tipi al/dal nostro codice, tuttavia abbiamo riscontrato un problema in quanto dovremmo ora chiamare una funzione nell'SDK di Adobe che restituisce un vettore popolato che causa un arresto anomalo quando esce dall'ambito .
Ovviamente, è un problema con l'allocazione della memoria nell'SDK di Adobe che appartiene a un altro heap quando finalmente è stato liberato nel mio codice. Quindi penso che forse potrei fare qualcosa di intelligente come in qualche modo sovrascrivere o esportare l'allocatore usato nel loro SDK in modo da poterlo usare per ripulire i contenitori restituiti dalle loro funzioni.
Sto anche cercando di scrivere un involucro o una sorta di strato thunking cui contenitori STL sarebbero schierate in modo sicuro tra il mio codice e l'SDK (anche se questo suona molto disordinato).
In alternativa, sto anche utilizzando GetProcessHeaps
per identificare l'heap utilizzato dall'SDK e provare a liberare questo heap anziché l'heap predefinito.
Qualcuno ha qualche consiglio su come possiamo risolvere questo problema?
Questa è una tecnica molto comune, l'ho vista anche in C, dove una libreria richiede agli utenti di fornire un callback allocazione/de-allocazione tramite una sorta di punto init() della libreria. – Justin