最近,我发现(在这里)不能在创建其内存的不同程序集中删除指针(或至少是数组)。据我所知,指针是内存中的一个变量,它的值是内存中另一个变量的地址。因此,为什么不能擦除指针的值(变量的地址),并从另一个程序集中释放它的内存?
问问题
148 次
1 回答
3
任何动态分配都需要回到分配它的同一个堆上。每个 DLL(我希望一个assembly
DLL 对应于一个 DLL)能够拥有自己的堆,因此您需要在分配它的同一个 DLL 或奇怪的事情(未定义的行为 - 例如错误或崩溃)中释放它会发生。
因此,除非您知道两个不同的模块(DLL、程序集)具有相同的堆,否则您无法释放一个模块中分配给另一个模块的东西。
将某些东西返回到它来自的堆的要求有点像把图书馆的书还给“错误”的图书馆——当图书馆员在图书馆找不到它来自的书时,这会引起各种各样的混乱,并且“新”图书馆也不会对这本书有任何了解。想象一下,如果我们在访问我们的库时都这样做了……堆将包含“跟踪”堆中对象的内部数据结构。如果我们突然开始把它们放回不属于它们的地方,就会发生奇怪的事情。
于 2013-03-10T15:30:10.667 回答