Все модули в работающем процессе имеют одно и то же адресное пространство (не важно, Windows вы или Linux или что-то еще, это общий принцип). Однако будьте осторожны: чтение или запись из модуля A в буфер, принадлежащий модулю B, в порядке, но освобождение буфера, вероятно, плохо.
В Windows это зависит от библиотеки времени выполнения, с которой связано приложение. Если это не среда выполнения DLL ( 'многопоточная DLL' ), каждый модуль поддерживает свою собственную копию менеджера кучи. Таким образом, модуль, который выделил область памяти, также должен отвечать за ее уничтожение, поскольку об этом знает только его собственный менеджер кучи. Если вы будете следовать этому руководству, у вас не возникнет проблем (связывание со средой выполнения DLL позволяет избежать этой проблемы, поскольку все модули работают с одним и тем же менеджером кучи, находящимся где-то в msvXXXnnn.dll, но порождают другие проблемы).
Edit:
ReadData (void * *) - это функция C ++ из внешней библиотеки DLL. В этой функции память для буфера выделяется функцией malloc и заполняется данными.
Это может столкнуться с вышеупомянутой проблемой распределителя. Либо добавьте еще одну функцию к этой DLL (FreeData
), которая явно отвечает за освобождение буфера (как предложил Нил Баттерворт) и просто вызывает свою собственную free()
. Или вы добавляете функцию DLL, чтобы запросить размер буфера, выделить его заранее и передать его в ReadData
(это самый чистый выбор imo).