Золотое правило заключается в том, что вы должны освободить из той же кучи, которая использовалась для выделения памяти.
Если вы выделите ее с помощью malloc()
, вы должны освободить ее с free()
из той жеC RTL.Аналогичным образом, на управляемой стороне AllocHGlobal()
должно быть сбалансировано на FreeHGlobal()
.
Теперь AllocHGlobal()
реализуется путем вызова функции Win32 LocalAlloc
.Таким образом, вы можете освободить такую память с помощью вызова LocalFree
на родной стороне.И наоборот.
Если вы хотите использовать кучу, которая является общей для собственной и управляемой, более распространенным является использование кучи COM.На родной стороне используйте CoTaskMemAlloc()
и CoTaskMemFree()
.На управляемой стороне используйте Marshal.AllocCoTaskMem()
и Marshal.FreeCoTaskMem()
.
Однако вам следует избегать проектирования системы подобным образом.Гораздо проще придерживаться правила, согласно которому вся память, выделенная на управляемой стороне, освобождается там, а также для собственной стороны.Если вы не будете следовать этому правилу, скорее всего, вы скоро потеряете информацию о том, кто за что отвечает.