Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与c+共享内存分配+;和JNI 我在java中编写一个C++程序包。包装器是使用SWIG完成的。我有以下问题:当我调用java中的函数,它在C++中创建大对象时,java没有“看到”它分配了大量内存,因为java中没有分配它。问题是当对象被删除时,垃圾收集器没有被调用,因为在Java端有大量的可用内存。我尝试的是实现这里描述的内容:。这个想法是在java堆中分配C++空间。因为我不想对每个新的< /代码>使用它,我已经重命名了新< /COD>和 Dele> ,并在需要的地方从我的C++代码中明确地使用它们。_Java_C++_Java Native Interface_Swig - Fatal编程技术网

与c+共享内存分配+;和JNI 我在java中编写一个C++程序包。包装器是使用SWIG完成的。我有以下问题:当我调用java中的函数,它在C++中创建大对象时,java没有“看到”它分配了大量内存,因为java中没有分配它。问题是当对象被删除时,垃圾收集器没有被调用,因为在Java端有大量的可用内存。我尝试的是实现这里描述的内容:。这个想法是在java堆中分配C++空间。因为我不想对每个新的< /代码>使用它,我已经重命名了新< /COD>和 Dele> ,并在需要的地方从我的C++代码中明确地使用它们。

与c+共享内存分配+;和JNI 我在java中编写一个C++程序包。包装器是使用SWIG完成的。我有以下问题:当我调用java中的函数,它在C++中创建大对象时,java没有“看到”它分配了大量内存,因为java中没有分配它。问题是当对象被删除时,垃圾收集器没有被调用,因为在Java端有大量的可用内存。我尝试的是实现这里描述的内容:。这个想法是在java堆中分配C++空间。因为我不想对每个新的< /代码>使用它,我已经重命名了新< /COD>和 Dele> ,并在需要的地方从我的C++代码中明确地使用它们。,java,c++,java-native-interface,swig,Java,C++,Java Native Interface,Swig,这种机制似乎有效(我可以看到Java的堆在垃圾收集器中不断增长和收缩),但不幸的是,我遇到了一个随机崩溃,这似乎是在memcpy期间发生的 如果我手动调用垃圾收集器,我的程序可以工作,但它不是一个非常干净的方法 谢谢你提供任何线索。事实上,我没有注意到swig网站上的以下行: 如果要使用gcc启用的优化(例如-O2),请确保也使用-fno严格别名进行编译 这似乎解决了问题难道你不能简单地通过SWIG手动调用C++对象析构函数吗?“不幸的是,因为大多数Java实现都调用malloc和free,所以

这种机制似乎有效(我可以看到Java的堆在垃圾收集器中不断增长和收缩),但不幸的是,我遇到了一个随机崩溃,这似乎是在
memcpy
期间发生的

如果我手动调用垃圾收集器,我的程序可以工作,但它不是一个非常干净的方法


谢谢你提供任何线索。

事实上,我没有注意到swig网站上的以下行:

如果要使用gcc启用的优化(例如-O2),请确保也使用-fno严格别名进行编译


<>这似乎解决了问题

难道你不能简单地通过SWIG手动调用C++对象析构函数吗?“不幸的是,因为大多数Java实现都调用malloc和free,所以这个解决方案对C包装的结构不起作用”您是否检查过这不是您的情况?好的,您希望Java从其堆中为您提供内存,而不是GC,直到您不再需要该对象。java如何知道后一种情况何时发生?请看一下我帖子中的链接,您将看到
delete
操作符调用
env->DeleteGlobalRef(pJalloc->ref);Env- > ReleSeBytAREARYARECTON< /代码> @ ViuZuo,我只使用C++代码,很可能在程序中有bug。混合和匹配各种分配器听起来像是制造奇怪的memcpy bug的秘方。