COM+ 应用程序,在 Windows XP SP 3 上使用 MS Visual Studio 6、SP 6 构建,以及远程调试。
我的主要问题是这个;如果我可以进入“删除”,为什么我无法进入“新”?我主要是在寻找关于我应该研究什么的想法。
我正在做一个我刚刚熟悉的相当大的项目。当前的问题是堆损坏问题,其中发布版本最终会耗尽其工作集并崩溃。这个问题是如此普遍,以至于下面的代码会破坏堆:
int * iArray = new int [100];
delete [] iArray;
我说“损坏堆”是因为调试输出在“删除”上显示“heap [dllhost.exe]:指定给 rtlvalidateheap 的地址无效”。
我可以很好地进入“删除”调用,它似乎正在调用正确的调用(位于 ...\Microsoft Visual Studio\VC98\CRT\SRC 中的 DELOP.cpp 中)但是,无论出于何种原因,我都无法进入任何对“新”的调用。我在这里抓住了稻草,但我感觉代码库中的某个地方有人覆盖了“新”运算符,而我正在查看的代码无意中使用了它。发布版本的症状似乎是内存被分配给一个堆并试图从另一个堆中删除,至少这是我的预感。
编辑:确认!对不起大家,我发布得太早了,应该提供更多信息。
我搜索了代码库并找到了一些覆盖,但它们都在类中,而不是全局定义的。唯一不在类中的是以下内容:
struct _new_selector
{
};
inline void* operator new(size_t, void *ptr, _new_selector)
{
return (ptr);
}
但这是一个新的展示位置,我很确定在这种情况下它不算数。对于原始的“新”,我应该进入什么库?我猜它与“删除”相同,但如果不是,也许我只是没有调试信息?
编辑2:搞砸这个我发现在调试版本中这个问题不存在。我已经查看了运行时库,它使用 /MD 和 /MDd 进行调试。不仅如此,我还使用 /MDd jut 构建了发布版本,以确保仍然没有任何变化。查看调试版本和发布版本的地图,新操作员(带有它的修饰)如下:
释放:
0001:00061306 ??2@YAPAXI@Z 10062306 f MSVCRTD:MSVCRTD.dll
0002:00000298 _imp ?? 2@YAPAXI@Z 1006e298 MSVCRTD:MSVCRTD.dll
调试:
0001:00077d06 ??2@YAPAXI@Z 10078d06 f MSVCRTD:MSVCRTD.dll
0004:00000ad4_imp ??2@ YAPAXI @Z 100b5ad4 MSVCRTD:MSVCRTD.dll
我还检查了删除运算符:
释放:
0001:000611f0 ??3@YAXPAX@Z 100621f0 f msvcprtd:delop_s.obj
调试:
0001:00077bf0 ??3@YAXPAX@Z 10078bf0 f msvcprtd:delop_s.obj
另外,我没有打印出来,但如果有帮助,我可以得到它,新运算符的反汇编在发布和调试中看起来是一样的。所以我想这不是覆盖?运算符的内联覆盖会使这不正确吗?
此外,作为一个产生多个 dllhost.exe 进程的 COM+ 应用程序,对 new 运算符的调用是否可以转到另一个 DLL 或 exe,而对删除的调用是否可以转到相反的位置?