c – 内存仍然可以修复错误,但为什么?

前端之家收集整理的这篇文章主要介绍了c – 内存仍然可以修复错误,但为什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试使用共享库来构建模块化程序.

有两个要编译的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>是的,所以你不妨使用它.

原文链接:https://www.f2er.com/c/440936.html

猜你在找的C&C++相关文章