我正在用Java编写一个C ++程序包装器。包装器使用SWIG完成。我有以下问题:当我从Java调用一个用C ++创建一个大对象的函数时,Java没有“看到”它已经分配了大量内存,因为它没有在Java堆中分配。问题是当从Java端删除对象时没有调用垃圾收集器,因为有足够的可用内存。我试过的是实现这里描述的内容:http://www.swig.org/Doc1.3/Java.html#java_heap_allocations。我们的想法是在Java堆中为C ++分配内存空间。由于我不想对每个new
使用它,我已重命名new
和delete
并在需要时从我的C ++代码中明确使用它们。
这个机制似乎有效(我可以看到Java的堆正在被垃圾收集器增长和缩小)但不幸的是我在memcpy
期间似乎发生了随机崩溃。
如果我手动调用垃圾收集器,我的程序正在运行,但这不是一个非常干净的方法。
感谢任何线索。
答案 0 :(得分:2)
事实上,我没有注意到swig网站中的以下内容:
如果要使用gcc打开优化(例如-O2),请确保使用-fno-strict-aliasing进行编译
这似乎已经解决了问题
答案 1 :(得分:1)
难道你不能简单地通过SWIG手动调用C ++对象析构函数吗?这似乎对我有用。