您好我正在使用全局覆盖new / delete的库。但是这个库有问题,问题是它必须在main函数中手动初始化。
现在我正在尝试使用另一个在调用main之前初始化一些函数的库,遗憾的是这个库在这些函数中使用了new。所以我得到错误,因为使用重写的new / delete关键字的内存管理器尚未初始化。
我真的很想使用默认的内存管理器,因为我想将单元测试添加到这个库中。使用我想要测试的库所使用的内存也没有多大意义。我的单元测试库也使用它。
所以我的问题是,当包含第二个库并且只使用默认的new / delete时,是否可以忽略全局覆盖的new / delete?
我在Windows 7上使用visual studio 2010和标准C ++编译器。
答案 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")
如果它确实是由函数覆盖完成的,那么你可以自己临时构造一个“新”宏,它调用另一个名称放在别处的函数,它只调用标准函数。 在函数调用之前解析宏。