C++ 关于vc2013中的跨dll边界删除指针

C++ 关于vc2013中的跨dll边界删除指针,c++,windows,dll,crt,C++,Windows,Dll,Crt,从中,我了解到,跨越模块边界删除obj甚至可能使用ms vc2012或更新版本的MT选项,这令人惊讶 但是,在做了一些测试之后,我感到困惑(我的平台是win7中的vc2013 update4)。 我在dll中新建一个obj,并在exe中删除它。 当dll和exe都使用MT选项编译时,它看起来运行得很好。 但是,当使用MTd编译dll和exe时,会出现断言错误“\u pfirstblock==phead” 有人能告诉我,在vs2013中,使用由MT/MTd选项编译的模块可以跨模块边界释放内存吗?是

从中,我了解到,跨越模块边界删除obj甚至可能使用ms vc2012或更新版本的MT选项,这令人惊讶

但是,在做了一些测试之后,我感到困惑(我的平台是win7中的vc2013 update4)。 我在dll中新建一个obj,并在exe中删除它。 当dll和exe都使用MT选项编译时,它看起来运行得很好。 但是,当使用MTd编译dll和exe时,会出现断言错误“\u pfirstblock==phead”


有人能告诉我,在vs2013中,使用由MT/MTd选项编译的模块可以跨模块边界释放内存吗?

是的,CRT从VS2012开始从默认进程堆进行分配。GetProcessHeap()返回的。这一变化的主要动机可能不是改进的模块互操作,VS2012最初不支持XP,因此不再需要创建私有堆并调用HeapSetInformation()来打开低碎片堆。Vista和更高版本在默认情况下启用了它

但这并没有持续多久,一场抗议风暴迫使他们恢复了对XP的支持。在不改变代码的情况下,我从未见过有人对此抱怨。让您怀疑,支持一个古老操作系统的感知需求是否与实际需求相符

否则,它不会解决由于在一个进程中有多个CRT副本而导致的其他问题。与您的案例/MT vs/MTd一样,CRT的调试构建向分配的内存块添加额外的元数据,以检测堆损坏和错误的指针使用情况。非调试CRT分配的块中缺少的。因此,当您将该指针传递到调试CRT中的free()或::operator delete调用时,它找不到返回的元数据

以及CRT中全球状态引起的其他问题的范围。像errno、setlocale()、strok()、strerror()、asctime()、gmtime()等等


因此,基本建议不会改变,只对简单的单模块程序(只有一个EXE,没有DLL)使用/MT,或使用具有精心设计的界面的DLL。

我感谢您的回答,非常感谢。我很好奇,想知道在vs12或其他高级版本中跨模块释放内存是否有任何负面后果?尽管微软不打算这样做。