C++ - 在调试期间无法使用 'new' 运算符

标签 c++ new-operator visual-studio-6

COM+ 应用程序,在 Windows XP SP 3 上使用 MS Visual Studio 6、SP 6 构建,并进行远程调试。

我的主要问题是;如果我可以进入“删除”,为什么我不能进入"new"?我主要是在寻找关于我应该研究什么的想法。

我正在从事一个相当大的项目,我才刚刚熟悉。当前的问题是堆损坏问题,其中发布版本最终会耗尽其工作集并崩溃。该问题非常普遍,以下代码将破坏堆:

int * iArray = new int [100];
delete [] iArray;

我说“损坏堆”是因为在“删除”时调试输出显示“堆 [dllhost.exe]:指定给 rtlvalidateheap 的地址无效”。

我可以很好地进入“删除”调用,它似乎正在调用正确的调用(位于 ...\Microsoft Visual Studio\VC98\CRT\SRC 中的 DELOP.cpp 中)但是,无论出于何种原因,我无法进入任何对“new”的调用。我在这里捕获了救命稻草,但我感觉代码库中的某个地方有人覆盖了"new"运算符,而我正在查看的代码无意中使用了它。发布版本的症状似乎是内存被分配给一个堆并试图从另一个堆中删除,至少这是我的直觉。

编辑: 阿克!对不起大家,我发布得太早了,应该提供更多信息。

我搜索了代码库并发现了一些重写,但它们都在类中,而不是全局定义的。唯一不在类里面的是:

struct _new_selector 
{

};

inline void* operator new(size_t, void *ptr, _new_selector)
{
    return (ptr); 
}

但这是一个新的展示位置,我很确定在这种情况下它不算数。对于原始"new",我应该进入什么库?我猜它与“删除”相同,但如果不是,也许我只是没有它的调试信息?

编辑 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,而对 delete 的调用转到相反的方向?

最佳答案

根据您的预感,代码中的某处可能存在重载的新内容,您可以检查的内容很少

  1. 代码的反汇编,找出那个文件中的库名,一般在汇编中会有一些东西给你提示
  2. 如果您找不到库名称,请检查您输入的程序集中的地址。然后在调试输出窗口中,检查各种库的加载地址 - 这可以为您提供有关要检查哪个库的线索
  3. 如果以上方法没有帮助,请检查您是否可以为整个项目生成 map 文件。如果可以,那么您可以在 map 文件中查找地址,这可能会有所帮助
  4. 尝试使用运行时库的调试版本。不记得打开 debug_malloc 的选项是什么。这可以帮助您弄清楚堆上发生了什么

社区可以添加更多我可能遗漏的内容。最后,如果您确实解决了问题,请分享您是如何解决的。在这里或作为您博客的链接。处理大型项目的堆问题通常并不容易,我们都可以学到一两个新技巧。

关于C++ - 在调试期间无法使用 'new' 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9604648/

相关文章:

java - 类的对象作为类内的实例变量

c++ - 如何在 C++ 中将列表存储在 map 中?

c++ - 为什么使用带有 C++ 'vector' 的新调用?

Java 新手无法理解某些 `new` 语法

c++ - 如何使用 VS C++ 6.0 在 C++ 应用程序中嵌入 Python 2.4?

c - Visual Studio 6 中的默认变量边界对齐方式是什么?

c++ - libwebsockets 与 WebSockets++

c++ - 重载新运算符 : How the size will be passed?

c++ - dll 在 VS2010 项目中运行良好,但在 VS6 应用程序中出现访问冲突

c++ - 如何删除分配给基类的指针?