gpt4 book ai didi

android - 是否可以释放 C++ 分配的内存输出

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:48:34 25 4
gpt4 key购买 nike

我想知道是否可以从 C++ 中释放一个返回值。我在 C++ 中使用 NDK 来构建 android native 库。

我想做这样的事情:

在我的 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。

所有此类对象都支持这种或那种基本上会释放元素的 clear()、reset() 或 resize(0) 方法。与在 Java 中一样,一些其他代码可能仍然保留对任何元素的引用。更糟糕的是,对于您提出的任何数据结构,总有一种方法可以执行“深层复制”并保留您想要销毁的值。

关于android - 是否可以释放 C++ 分配的内存输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33545983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com