在c ++程序中使用电栅栏

Nic*_*lin 5 c++ linux memory-management memory-fences electric-fence

我最近一直在尝试使用Electric Fence,我无法弄清楚如何将它与c ++代码一起使用.

这是一个例子:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

int main()                                                                                                                                                 
{                                                                                                                                                                                                                                                                                                     
        int *a = new int(10);                                                                                                                              
        delete a;                                                                                                                              
}  
Run Code Online (Sandbox Code Playgroud)

我编译了它

g++ ./test.cpp -o test -lefence -L/home/bor/efence_x86_64/lib -lpthread
Run Code Online (Sandbox Code Playgroud)

而且我在开始时看不到Electric Fence标题,并且在可执行文件中找不到EF符号(使用nm命令).

但是,如果我修改这样的程序:

// test.cpp
#include <cstdlib>                                                                                                                                         

using namespace std;                                                                                                                                       

int main()                                                                                                                                                 
{                                                                                                                                                          
        char *p = (char*)malloc(20);                                                                                                                       
        free(p);                                                                                                                                           
        int *a = new int(10);                                                                                                                              
        delete a;
}
Run Code Online (Sandbox Code Playgroud)

一切都很好 - EF出现了.我知道它解决了这个问题,我知道:).我只是想了解为什么它首先不起作用,因为new()应该打电话malloc(),delete()打电话free(),不是吗?

我参与其中的原因是一个使用boost库和其他几个的大项目.这个程序从不打电话malloc()free()直接打电话.当我使用EF构建它时,我不会将EF链接到最终的可执行文件,但重建了所有试图将EF链接到它们的库.我无法在其中任何一个中找到EF符号.这是正确的方法吗?或者它是错误的,EF最终只能链接到可执行文件,libs应保持不变?但是我再次在可执行文件中找不到EF符号.

Nec*_*lis 4

您假设编译器正在编译后面的代码new,但该代码通常驻留在预编译 RT 中的某个位置。

new通常也不会malloc直接调用(在某些系统(如 Windows)上,它malloc根本不调用),它在处理分配之前和之后执行一些自己的任务。对于这样的事情,您可能必须走全局重载的半邪恶路线new,并delete强制它直接从您的代码中调用mallocfree