如何使用swig管理Ruby垃圾回收器
How to manage the Ruby Garbage collector with swig
我有一个C++接口,我用swig为它创建ruby绑定。我可以构建这些绑定,但垃圾回收器有问题。我的ruby代码如下:
parser = HeaderParser.new(source_file, ['/usr/lib'])
parser.parse
functions = parser.getFunctions //Array of Ruby wrapped class named Function
functions.each do |f|
puts f.getName
end
问题是,如果垃圾收集器删除了解析器对象,那么所有对Function对象方法的调用都会导致Segfault。这是因为我的C++函数对象只使用指向Parser对象分配的内存的指针。
我想找到一种方法来告诉GC不要释放HeaderParser对象,因为有使用的Function对象
我试过使用这样的指令
%trackbobjects
并像文档中那样为垃圾收集器编写一个ruby标记函数,但没有成功
%header %{
static void mark_HeaderParser(void* ptr) {
TruckBoris::HeaderParser* hp = (TruckBoris::HeaderParser*) ptr;
/* Loop over each object and tell the garbage collector
that we are holding a reference to them. */
std::vector<TruckBoris::Function> fns;
fns = hp->getFunctions();
int count = fns.size();
for(int i = 0; i < count; ++i) {
TruckBoris::Function fn = fns[i];
VALUE object = SWIG_RubyInstanceFor(&fn);
if (object != Qnil) {
rb_gc_mark(object);
}
}
}
%}
C++接口上的信息我有一个初始化Clang CompilerInstance和ASTConsumer:的主类
class HeaderParser
{
public:
HeaderParser();
HeaderParser( std::string sourceFile, std::vector<std::string> headersPaths);
~HeaderParser();
...
bool parse(bool mainFile = false);
...
std::vector<Function> getFunctions() const;
...
private:
...
clang::CompilerInstance m_ci;
HeaderElements *m_headerElements; // an ASTConsumer
};
当调用HeaderParser::parse方法时,它解析源文件并填充Function对象的向量。
这些对象只是使用FunctionDecl指针指向由HeaderParser中的compilerInstance分配的内存。
class Function
{
public:
Function();
Function(clang::FunctionDecl * fn);
~Function() {}
std::string getName() const;
private:
clang::FunctionDecl * m_function;
};
因此函数类方法构造如下:
std::string Function::getName() const
{
if(m_function)
return m_function->getNameInfo().getAsString();
else
return std::string();
}
我只需要简化所有内容就可以了。
在HeaderParser类中,不直接返回带有:的std::vector<Function>
std::vector<Function> getFunctions() const;
我使用过:
int nbFunctions() const;
Function getFunction(int) const;
并且,删除mark指令,让swig执行magik。之后,我只需要在我的ruby lib文件中添加:
class Rtruckboris::HeaderParser
def functions
fns=[]
(0..(functions_num() -1)).each do |i|
fns<<get_nth_function(i)
end
fns
end
...
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 如何使用 Ruby 的 Enumerable .map 方法在 C++ 中执行类似于 map 的操作
- 使用 LLVM 的 libc++ 时,__1 符号从何而来?
- 使用Swig将std::set转换为ruby
- 在std::cout之后使用std::cin时,换行符从何而来
- 如何调整一个非托管的C++DLL以供Ruby使用
- 如何使用swig管理Ruby垃圾回收器
- 使用 Rice 在 C++ 中构建 Ruby 扩展:如何将 Ruby 方法(回调)的指针传输到C++函数
- 在Windows上开始使用SWIG-Ruby
- 使用 VS2010 IDE 生成的 Ruby 的 SWIG 包装器 DLL 崩溃
- 为什么以及在何处在C++中使用引用和指针
- 使用SWIG 2.0.4和Ruby 1.9.2来运行SWIG类示例
- 在ruby中使用c++ .so库无法解析的符号
- 如何在C/ c++中使用Ruby
- 基例如何影响使用递归函数的哪些行
- 在OS X 10.9.2下使用Rbenv制作Ruby 2.1.1失败