我有一个用C ++编写的程序,它调用另一个库中的函数。第一次调用给定函数时,我能够从库中得到正确的答案。 但是,呼叫第二次失败。我认为这个函数使用某种静态变量,它们在第一次调用之前设置为默认值。在第一次调用期间,静态变量被更改,因此第二次调用失败。 (我可以重置一些静态变量,但可能不是全部。)
有没有办法将C ++中的所有静态变量重置为默认值?
答案 0 :(得分:2)
您可以使用dlopen
函数加载库,使用这些函数,然后使用dlclose
。之后,将卸载一个库,并且(希望)清除所有数据。
http://tldp.org/HOWTO/Program-Library-HOWTO/dl-libraries.html
更新:dlopen
适用于共享库。如果你有一个静态库,你可以将它包装成共享。
加载库的路径可以是绝对路径,相对路径或没有路径组件,在这种情况下使用默认的ld.so机制(LD_LIBARY_PATH,/ lib等)。
答案 1 :(得分:0)
在POSIX中,argv
参数中main
的第一个字符串是表示调用的UNIX可执行文件的路径。您可以通过调用execvp
(或https://github.com/lydell/coffee-script/tree/1.8-at-params-warn)将当前流程替换为新的可执行文件。
接下来,您可以通过调用execvp
来重置全局变量的状态。
但请注意,重置所有全局变量也会重置堆的状态,因此分配了malloc
或new
的所有对象将不再存在。此外,执行将重置为main
,因此堆栈上的对象也将丢失。
破解图书馆的状态从根本上是不安全的,因此语言不允许你这样做。
something similar。请注意,为了终止自身,它希望您传递0
的初始命令行参数。终止可能不是您的程序中的问题,还有其他方法可以解决问题。如有必要,可以提出另一个问题。
#include <unistd.h>
#include <iostream>
void f() {
static int cnt = 0;
std::cout << cnt ++ << '\n';
}
int main( int argc, char *argv[] ) {
f();
f();
if ( * argv[1] == '0' ) {
++ * argv[1];
std::cout << "try again" << std::endl;
execvp( argv[0], argv );
}
std::cout << "done\n";
}
输出:
0
1
try again
0
1
done