我认为这是不可能的,除非修改库本身。我猜这是关于静态库的(在dll内部,重载的new/delete将由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
文件将包含每个符号的混淆名称和该符号所在对象的标识符。例如:
14286 ?_Rank@?$_Arithmetic_traits@C@std@@2HB
14286
告诉你符号所在的 obj 'identifier'。如果你找不到 new/delete,可以运行以下命令:
DUMPBIN /SYMBOLS input.lib > sym.txt
这将把每个符号的混淆和未混淆名称刷新到sym.txt
中。
最后,通过在我们的示例中将obj_to_remove
替换为compilation.dir\objfile1.obj
,使用上面的LIB
命令删除obj文件,并链接到removed.lib
。
现在,如果你不幸的话,你需要的其他符号可能与new/delete在同一个对象文件中。在这种情况下,你可以使用类似this的方法“黑客”lib(例如将new
重命名为dew
,将delete
重命名为nelete
)。
std::tr1::shared_ptr
的风格创建一个内存管理对象。 - count0