为什么不能在组件中删除指针?

问题描述:

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

+0

你打电话给一个组件?这可能与翻译单位相同吗? – 2013-03-10 15:19:49

+3

你在这里使用'程序集',但我认为你可能意味着库或DLL。无论如何,'new'和'delete'的底层实现可能会因这些DLL /库所使用的运行时间而有所不同,这会在混合和匹配时造成损坏。 – Joe 2013-03-10 15:19:51

+0

原谅我的无知,我从.Net来到C++,并使用汇编和库作为同义词(实际上我不太清楚它们的区别)。 @Joe,'new'和'delete'的不同实现不一样吗?你能否举一个例子来说明哪里会出现问题? – JMCF125 2013-03-10 15:26:24

任何动态分配需要返回到分配的堆上。每个DLL(我期望assembly对应于一个DLL)能够拥有自己的堆,因此您需要将它释放到与它分配的DLL相同的DLL中,或者是奇怪的东西(未定义的行为 - 例如错误或崩溃)会发生。因此,除非你知道两个不同的模块(DLLs,asemblies)具有相同的堆,那么你不能在一个模块中释放一些在另一个模块中分配的东西。

将某些东西返回到它所在的堆的要求有点像将图书馆书籍返回到“错误”的图书馆 - 当图书管理员无法在图书馆中找到该书时会引起各种混乱来自,而“新”图书馆也不会有这本书的任何知识。想象一下,如果我们在去图书馆的时候都这样做了,那么堆将包含内部数据结构,用于“跟踪”堆中的对象。如果我们突然开始把它们放回他们不属于的地方,就会发生奇怪的事情。

+1

请注意,“每个DLL都有自己的堆”不一定是真的。您可以编译DLL以使用共享堆。您也可以编译它们以使用单个堆。 – Yakk 2013-03-10 15:54:42

+0

谢谢,修改澄清。 – 2013-03-10 16:03:16

+0

这混乱让我感谢,我不必在Windows上编程... – vonbrand 2013-03-10 17:39:08