c++ - 在 C++ 程序中使用电子围栏

标签 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;                                                                                                                              
}  

我用它编译的

g++ ./test.cpp -o test -lefence -L/home/bor/efence_x86_64/lib -lpthread

而且我在开始时没有看到 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;
}

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

我进入这个项目的原因是一个使用 boost 库和其他几个库的大项目。而且这个程序从不直接调用malloc()free()。当我用 EF 构建它时,我不仅将 EF 链接到最终的可执行文件,而且重建了所有试图将 EF 链接到它们的库。而且我在其中任何一个中都找不到 EF 符号。这是正确的方法吗?或者它是错误的,最后应该只将 EF 链接到可执行文件,库应该保持原样吗?但是我又一次在可执行文件中找不到 EF 符号。

最佳答案

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

new 一般也不会直接调用malloc(在Windows等一些系统上,它根本不会调用malloc),它有a few tasks of its own在它处理分配之前和之后执行的。对于这样的事情,你可能不得不走全局重载 newdelete 的半邪恶路线,以强制它直接调用 mallocfree 来自您的代码。

关于c++ - 在 C++ 程序中使用电子围栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9494915/

相关文章:

c++ - 为什么后缀增量运算符采用虚拟参数?

c++ - 如何在 OpenCV 中将图像读取为 double?

linux - 通过 MAC 地址检查许多蓝牙设备的快速方法

c++ - openCV 将 IplImage 与 cv::Mat 混合

c++ - 为什么不为函数返回的对象调用析构函数?

C++ 递归 - 如何确保我不重复相同的值

c++ - conio.h 和 linux 问题

c - 使用 sprintf 时出现段错误

java - 通过 Java 代码检查进程是否在 linux 上运行

java - Tomcat JVM 内存调整