忽略全局覆盖的新/删除

时间:2012-09-21 12:41:01

标签: c++ visual-studio

您好我正在使用全局覆盖new / delete的库。但是这个库有问题,问题是它必须在main函数中手动初始化。

现在我正在尝试使用另一个在调用main之前初始化一些函数的库,遗憾的是这个库在这些函数中使用了new。所以我得到错误,因为使用重写的new / delete关键字的内存管理器尚未初始化。

我真的很想使用默认的内存管理器,因为我想将单元测试添加到这个库中。使用我想要测试的库所使用的内存也没有多大意义。我的单元测试库也使用它。

所以我的问题是,当包含第二个库并且只使用默认的new / delete时,是否可以忽略全局覆盖的new / delete?

我在Windows 7上使用visual studio 2010和标准C ++编译器。

3 个答案:

答案 0 :(得分:1)

如果不修改库本身,我认为这是不可能的。我想它是关于一个静态库(在dll中,重写的new / delete将由dll中的函数指向。)

您可以使用命令(可视命令提示符)从静态库中删除obj文件:

  LIB /REMOVE:obj_to_remove /OUT:removed.lib input.lib

要找出要移除的obj,请先运行:

  DUMPBIN /ARCHIVEMEMBERS input.lib

你会看到诸如

之类的行
    Archive member name at 14286: /0  compilation.dir\objfile1.obj

14286'标识'obj文件。要查看每个符号的位置,请运行:

 DUMPBIN /LINKERMEMBER:1 input.lib > members.txt

并查找新/删除。 members.txt将包含每个符号的错位名称以及此符号所在的obj的标识符。例如

    14286 ?_Rank@?$_Arithmetic_traits@C@std@@2HB

14286告诉你符号所在的obj'标识符'。如果您在查找新/删除时遇到问题,可以运行:

 DUMPBIN /SYMBOLS input.lib > sym.txt

将为每个符号刷新sym.txt错位和未编号的名称。

最后,在上面的LIB命令中移除obj文件,在我们的示例中将obj_to_remove替换为compilation.dir\objfile1.obj,然后链接到removed.lib

现在,如果你不幸运,你需要的其他符号可能与new / delete在同一个目标文件中。在这种情况下,您可以使用this之类的东西“破解”lib(比如将new重命名为dew,将delete重命名为nelete。)

答案 1 :(得分:0)

您可以将内存管理器的初始化从main放入共享库吗?

如果可以,您可以尝试强制库的初始化顺序(依赖性)在加载任何其他内容之前加载(并初始化)内存管理器。然而,这是一个非常脆弱(或特定)的解决方案,因为它将依赖于特定于平台的变通方法来强制初始化共享库的顺序。

答案 2 :(得分:0)

如果使用宏完成覆盖,则可以使用

#pragma push_macro ("new")
#undef new
...code with standard new here ...
#pragma pop_macro ("new")

如果它确实是由函数覆盖完成的,那么你可以自己临时构造一个“新”宏,它调用另一个名称放在别处的函数,它只调用标准函数。 在函数调用之前解析宏。