Und wie gebe ich eigentlich den Speicher des Arrays wieder ordnungsgemäß frei?
Indem die
DLL eine Funktion exportiert die exakt den gleichen Speichermanager benutzt. Schon die gemischte Benutzung von Pointern die durch statisch vs. dynamisch gelinkte Speicher-Funktionen erzeugt wurden gibt Probleme. Noch besser wird's nur bei Debug vs. Release Builds.
Ach ja, es gibt auch die Methode stattdessen ein Interface zu nehmen. Im Grunde hast du mit dem Interface dann aber die gleiche Ausgangssituation. Der Puffer enthielte dann eben auch gleich noch die Methode zum Freigeben.
Siehe bspw.:
IMalloc