内存仍然可以访问错误修复,但为什么
Memory still reachable bug fixed, but why?
我正在尝试使用共享库来构建模块化程序。
有两个 cpp 文件需要编译:
共享库,编译方式
g++ -fPIC -shared module.cpp -o module.so
//module.cpp
#include <iostream>
使用共享库的文件,编译方式
g++ src/main.cpp -ldl -o 二进制
或
g++ -DFIX src/main.cpp -ldl -o 二进制
//main.cpp
#include <dlfcn.h>
#ifdef FIX
# include <iostream>
#endif
int main()
{
void* h = dlopen("./module.so", RTLD_LAZY);
if ( h )
{
dlclose(h);
}
}
在未定义FIX
的情况下,valgrind 报告了很多仍然可以访问的内存(5,373 字节(,FIX
定义后,没有内存泄漏。
在共享库中使用 iostream
有什么问题?
4.7 和 g++-4.8 中。 G++-4.4 不显示此行为。可悲的是,我没有其他编译器可以测试(因此我不想切换到 g++-4.4(。
更新:
使用附加标志编译共享库文件-static-libstdc++ -static-libgcc
减少泄漏块的数量,但不能完全减少。 -static-libgcc
本身没有效果,-static-libstdc++
有一些影响,但不如两者。
1. 为什么或如何"修复"此问题?
我不确定为什么不深入研究libstdc++代码,但我假设iostreams库分配的内存在整个程序的持续时间内保持分配,当它被分配到共享库中时,valgrind 报告为问题,而不是在主程序中分配时。
2. 哪些等效的、独立的(来自标准库的(代码片段提供了相同的错误修复?
首先,我不知道为什么你想要一些"独立于标准库"的东西,而标准库可能正在分配仍然可以访问的内存。 解决方法是要么在任何地方根本不使用标准库,要么以不同的方式使用它。
其次,该"修复"是未定义的行为,因为您通过重新定义std::ios_base
与 std lib 中的正确定义不同而违反了一个定义规则。
获得相同行为的正确方法是在main.cpp
文件中#include <iostream>
,包括<iostream>
定义static std::ios_base::Init
对象。 或者,只需#include <ios>
然后定义static
变量(但不要重新定义std::ios_base
类型(,但这基本上就是<iostream>
所做的,所以你也可以使用它。
- 我的字符计数代码计算错误.为什么
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 为什么加载SDF会导致Mobilizer创建闭环错误
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 为什么我在使用void函数时得到错误代码C2276
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 为什么g++在未执行的代码处标记强制转换错误
- 有人知道为什么在开关中使用stoi函数会返回恒定的错误吗
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 为什么错误"permission denied","id returned 1 exit status"仅在 IM 使用 C++ 中的头文件 fstream 时才出现
- 为什么错误:"locate_zone"不是"std::chrono"的成员
- 为什么错误 C6386 缓冲区溢出与 strsafe.h 字符串 Cch 函数
- 为什么错误1400无效的窗口句柄
- 为什么错误LNK2001:在这种情况下未解析的外部符号
- c++为什么错误:no match for 'operator='
- 为什么错误"invalid conversion from 'char' to 'const char*"?