2012-09-21 53 views
7

嗨我正在使用全局重写新/删除的库。但是我对这个库有一个问题,问题是它必须在主函数中手动初始化。忽略全局重写新/删除

现在我试图使用另一个库,在调用main之前初始化几个函数,不幸的是这个库在这些函数中使用了新的函数。所以我得到错误,因为使用重写的新/删除关键字的内存管理器尚未初始化。

我真的想使用默认的内存管理器,因为我想添加单元测试到这个库。使用我想要测试的库也使用我的单元测试库也没什么意义。

所以我的问题是,如果有可能忽略包含第二个库的全局重写新/删除,并只使用默认的新/删除?

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

+0

答案将取决于平台和/或编译器上。 – atzz

+0

你们开发这两个图书馆还是他们的第三方?如果你是在控制内存管理代码,我会偏离重写新/删除,并创建一个*内存管理对象*风格的'std :: tr1 :: shared_ptr'。 – count0

+0

@ count0我们开发了内存管理器库。这是一个具有高度优化的垃圾收集器的自定义内存管理器。我正在尝试使用boost测试库进行单元测试。 – ProgrammerAtWork

回答

0

你可以将内存管理器的初始化主要放在共享库吗?

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

+0

重写的关键字写在头文件中,所以我不能将它放在另一个库中,我真的想使用默认的内存管理器,因为我想将单元测试添加到此库。 使用我想要测试的库也使用我的单元测试库时使用的内存没有多大意义。 – ProgrammerAtWork

+0

哦,强制依赖的初始化顺序可以工作,我不知道...但我仍然想使用默认的新建/删除,所以我可以添加单元测试库,而不用单元测试崩溃自己,如果有人拧紧。 – ProgrammerAtWork

+0

从你的问题看来,在内存管理初始化之前,你似乎只有使用:: new和:: delete的问题。如果你想使用两者,你​​必须明确地调用你想测试的新/删除。如果库设计人员不使用名称空间,那么您可能会遇到麻烦,因为您不知道他们在库内部调用了什么方法。 – count0

0

如果覆盖与宏做了你可以使用

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

如果真的是按功能覆盖完成,那么你可以暂时构建调用另一个名称的功能放置在别处“新”宏观自己哪个只是调用标准函数。 宏在函数调用之前被解析。

1

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

可以使用命令(Visual命令)从静态库中删除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 [email protected][email protected]@[email protected]@2HB 

14286告诉你obj的“标识”,其中的符号所在。如果你很难找到新/删除,你可以运行:

DUMPBIN /SYMBOLS input.lib > sym.txt 

将水冲到sym.txt每个符号的错位和未重整的名称。

在结束时,通过在我们的例子由compilation.dir\objfile1.obj替换obj_to_remove删除与LIB命令OBJ文件的上方,并且针对removed.lib链路。

现在,如果你不幸运,你需要的其他符号可能与新/删除在同一个目标文件中。在这种情况下,你可以在“黑客”使用类似this的lib(比如重命名newdewdeletenelete