C++ 为什么可以';不能跨程序集删除指针吗?

C++ 为什么可以';不能跨程序集删除指针吗?,c++,pointers,c++-cli,C++,Pointers,C++ Cli,最近,我发现()指针(或至少数组)不能在创建其内存的不同程序集中删除。据我所知,指针是内存中的一个变量,它的值是内存中另一个变量的地址。因此,为什么指针的值(变量的地址)不能被擦除,它的内存不能从另一个程序集中释放出来?任何动态分配都需要返回到它从中分配的同一堆上。每个DLL(我希望一个程序集对应于一个DLL)都有自己的堆,因此您需要将其释放到分配给它的同一个DLL中,否则会发生奇怪的事情(未定义的行为,例如错误或崩溃) 因此,除非您知道两个不同的模块(DLL、asemblies)具有相同的堆,

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

任何动态分配都需要返回到它从中分配的同一堆上。每个DLL(我希望一个
程序集
对应于一个DLL)都有自己的堆,因此您需要将其释放到分配给它的同一个DLL中,否则会发生奇怪的事情(未定义的行为,例如错误或崩溃)

因此,除非您知道两个不同的模块(DLL、asemblies)具有相同的堆,否则您无法释放一个模块中分配给另一个模块的某些内容


要求将某本书返回到其来源的书堆中有点像将一本图书馆的书返回到“错误”的图书馆——当图书馆员在其来源的图书馆中找不到该书时,会引起各种各样的混乱,“新”图书馆也不会知道该书。想象一下,如果我们去图书馆的时候都这么做。。。堆将包含“跟踪”堆中对象的内部数据结构。如果我们突然开始把它们放回不属于它们的地方,奇怪的事情就会发生

你叫什么大会?这可能与翻译单元相同吗?这里使用“assembly”,但我认为可能是指库或DLL。不管怎样,在代码的执行中,<代码> > <代码>删除>代码>在DLLS/库使用的运行时之间可能会发生变化,这会在混合和匹配时造成损坏。请原谅我的无知,我从.NET中来到C++,并使用程序集和库作为同义词(实际上我不太清楚区别)。Joe,
new
delete
的不同实现不是都一样吗?你能给出一个可能出现问题的例子吗?请阅读以下内容:。你在那里得到了一个很好的链接@DCoder,我刚刚阅读并标记了它以供将来参考。请注意,“每个DLL都有自己的堆”不一定是真的。您可以编译DLL以使用共享堆。您也可以编译它们以使用单个堆。谢谢,为了澄清而修改。@MatsPeterson,谢谢您的回答。我认为库的类比也使它更清晰、更有趣。@JoãoMiguel:是的,在其他操作系统中也可能存在这个问题。任何不是从单个堆分配内存的操作系统都会有这个问题(除非操作系统有某种特殊的机制来跟踪“分配到哪里”)。当然,C和C++都允许程序员生成一个自制的内存分配版本,当然,如果在Linux中分配了一些内存,比如说“代码> MMAP < /代码>,你就不能把它传递给<代码>免费< /代码>或<代码>删除>代码>去分配它。在Linux中,分配都通过相同的底层机制,到达相同的堆。即使是使用不同版本的编译器编译的部件。当我看到这个问题时,我真的觉得这很奇怪。。。