[英]is it possible to free allocated memory output from C++
我想知道是否可以从C ++中释放返回值。 我在C ++中使用NDK来构建Android本机库。
我想做这样的事情:
在我的C ++代码中:
JNI入口点
JNIEXPORT jbyteArray JNICALL Java_myMethod(JNIEnv * env, jobject obj){
int len = 16;
char* buf = (char*) malloc(len);
jbyteArray array = env->NewByteArray (len);
env->SetByteArrayRegion (array, 0, len, reinterpret_cast<jbyte*>(buf));
std::thread{&MyClass::asynchronousFree, this, array}.detach();
return array;
}
还有一个异步调用的方法来释放返回值
void Myclass::asynchronousFree(jbytearray array){
//code to free the memory after a specified time
}
在我的Android代码中:
void process(){
byte[] array = ndk.myMethod();
//do some stuff with the array
//here i need array erased from memory
}
谢谢你的帮助。
使用C ++进行此操作与使用Java进行相同操作没有什么不同。 这意味着,给定对数组或任何其他Java对象的引用,您不能强制该对象不存在,但可以更改其属性。
对于数组,它的长度是不可变的,但是元素不是。 您的asynchronousFree()
方法可以将所有元素设置为0,否则可以指示该数组不再有效。
为了更好地控制这种情况,可以使用任何您喜欢的Java容器,包括最接近数组功能的ArrayList或ByteBuffer。
所有这些对象都支持this或那个clear(),reset()或resize(0)方法,这些方法实际上将释放元素。 与Java中一样,其他一些代码可能仍保留对任何元素的引用。 更糟糕的是,对于您建议的任何数据结构,总有一种方法可以执行“深层复制”并保留要破坏的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.