小编jst*_*rom的帖子

如何动态加载自己的库,并在其中调用方法?

我想写一些C代码(好吧,如果它只适用于Linux)来动态加载一个新的共享库,然后从中调用一个方法(在运行时确定).这似乎已经成为可能,因为java可以动态加载本机库,然后从它们调用方法.

例如,我想做类似的事情:

int main() {
    libinfo_t * lib_details = load_shared_library("libfoo.so");
    run_method(lib_details, "bar", 7);
}
Run Code Online (Sandbox Code Playgroud)

这将使用参数7调用方法'bar'(bar是编译为libfoo.so的方法).

用例详细信息:

我想编译一个二进制文件,它加载目录中的所有共享库,并在原始程序的内存上下文中运行每个共享库的一些方法.我希望能够通过在目录中添加/删除共享库来快速启用或禁用它.

概念证明:

看来这应该是可能的,基于java设法动态链接jni代码的方式.您可以使用System.load(),并加载您选择的库.再加上内存编译,似乎它允许你从任意库运行任意函数.http://www.java2s.com/Code/Java/JDK-6/CompilingfromMemory.htm

我试过的事情:

  1. 我已经查看了'uselib'的联机帮助页面,这看起来很有用,但是一旦我加载它,我不确定该如何处理它.

  2. 一些谷歌搜索返回http://dyncall.org/,但这不是我需要的 - 这个项目仍然需要一个函数指针来进行函数调用.

即使没有具体的答案,我也会感激任何指向下一步的指针.谢谢!

c linux function shared-libraries

7
推荐指数
1
解决办法
282
查看次数

如何正确(和有效)释放gtk小部件中的内存

我正在尝试了解如何在完成GTK小部件时正确释放内存,例如,如果我需要创建和销毁许多小部件.但是,无论我尝试什么,valgrind似乎都表明内存泄漏.我已经查看了其他问题,包括列出GTK的valgrind抑制文件的问题,但它没有改变结果.

这是重现我的问题的最简单的代码片段:

#include "gtk/gtk.h"

int main()
{
    GtkWidget * widget = gtk_fixed_new();
    g_object_ref(widget);
    g_object_ref_sink(widget); // remove floating reference, and own this object ourselves

    g_object_unref(widget);

    gtk_widget_destroy(widget);
}
Run Code Online (Sandbox Code Playgroud)

我的期望是(在处理浮动引用之后),unref()函数应该将引用计数减少到零,然后释放所有内存.我把gtk_widget_destroy()放在那里以获得良好的衡量标准,但我不确定它实际上是否必要(并且它不会改变泄漏的大小).

使用G_SLICE=debug-blocks valgrind ./t3 --supression=~/Downloads/GNOME.supp来自GTK hello_world程序中的Memory Leaks的valgrind命令的输出 是

==10079== HEAP SUMMARY:
==10079==     in use at exit: 164,338 bytes in 847 blocks
==10079==   total heap usage: 1,380 allocs, 533 frees, 219,176 bytes allocated
==10079== 
==10079== LEAK SUMMARY:
==10079==    definitely lost: 0 bytes in 0 blocks
==10079==    indirectly lost: 0 bytes in …
Run Code Online (Sandbox Code Playgroud)

c gtk valgrind memory-management

6
推荐指数
1
解决办法
4263
查看次数