为什么不能跨程序集删除指针?

时间:2013-03-10 15:17:21

标签: c++ pointers c++-cli

最近,我发现(here)指针(或至少是一个数组)不能在创建其内存的不同程序集中删除。据我所知,指针是内存中的一个变量,它具有内存中另一个变量的地址值。因此,为什么不能删除指针的值(变量的地址),并将其内存从另一个程序集中释放出来?

1 个答案:

答案 0 :(得分:3)

任何动态分配都需要返回与分配的相同的堆。每个DLL(我希望assembly对应一个DLL)能够拥有自己的堆,所以你需要在它分配的同一个DLL中释放它,或者奇怪的东西(未定义的行为 - for将发生示例错误或崩溃)。

因此,除非你知道两个不同的模块(DLL,asemblies)具有相同的堆,否则你不能在一个模块中释放一些在另一个模块中分配的模块。

将某些东西归还给它所来自的堆的要求有点像将图书馆书籍归还给“错误”的图书馆 - 当图书管理员无法在图书馆中找到图书时会引起各种混淆来自,“新”图书馆也不会对这本书有任何了解。想象一下,如果我们在访问库时都这样做了......堆将包含“跟踪”堆中对象的内部数据结构。如果我们突然把它们放回原来不属于的地方,就会发生奇怪的事情。