我正在尝试使用共享库来构建模块化程序.
有两个要编译的cpp文件:
共享库,用.编译
g++ -fPIC -shared module.cpp -o module.so
//module.cpp
#include
文件使用共享库,编译用
g++ src/main.cpp -ldl -o binary
要么
g++ -DFIX src/main.cpp -ldl -o binary
//main.cpp
#include
在FIX未定义的情况下,valgrind会报告许多仍然可访问的内存(5,373bytes),如果定义了FIX,则不会泄漏任何内存.
在共享库中使用iostream有什么问题?
g -4.6,g -4.7和g -4.8会出现此问题. g -4.4没有显示这种行为.遗憾的是,我没有其他编译器进行测试(因此我不想切换到g -4.4).
更新:
使用附加标志-static-libstdc -static-libgcc编译共享库文件可以减少泄漏块的数量,但不能完全减少. -static-libgcc单独没有效果,-static-libstdc有一些效果,但没有两者兼有.
1. Why or how does this code snippet “fix” the issue?
我不确定为什么没有深入研究libstdc代码,但是我认为iostreams库分配的内存在整个程序的持续时间内保持分配,在valgrind分配时会报告为一个问题.共享库,但在主程序中分配时不会.
2. What equivalent,independent (from the standard library) code snippet provides the same bug fix?
首先,当标准库可能正在分配仍然可访问的内存时,我不知道为什么你想要“独立于标准库”的东西.修复程序要么根本不使用标准库,要么以不同方式使用它.
其次,“修复”是未定义的行为,因为您通过将std :: ios_base重新定义为std lib中的正确定义来违反One Definition Rule.
获得相同行为的正确方法是#include< iostream>在你的main.cpp文件中,包括< iostream>定义一个静态std :: ios_base :: Init对象.或者,只需#include< ios>然后定义静态变量(但不要重新定义std :: ios_base类型),但这基本上是< iostream>是的,所以你不妨使用它.