线程函数中的c ++参数更改
c++ argument changes in thread function
我正在编写一个 Android 应用程序,它使用 C++ (NDK) 读取文本文件。
我将文件 list
从 assets
文件夹复制到 /data/user/0/my-package/files/list
,在那里我可以用我的本机代码读取,复制完成后或者如果目标文件存在,我执行以下操作:
const char* fileName = env->GetStringUTFChars(_name, nullptr);
const char* filePath = env->GetStringUTFChars(_destination, nullptr);
if(copy_file(AAssetManager_fromJava(env, manager),fileName, filePath)){
Reader *r = new Reader();
log("Initializing reader with file: %s",filePath);
thread t(&Reader::read, r, filePath);
t.detach();// will crash if no detach, join() will block the UI thread.
}
还有我的 Reader::read
:
void Reader::read(const char* filePath){
log("Reading from file: %s",filePath);
ifstream infile(filePath);
string line;
while(infile>>line){
// read logic ...
}
}
有时我得到不同的输出
Initializing reader with file: /data/user/0/my-package/files/list
Reading from file: /data/user/0/my-package/files/list
一切都按预期进行。 但是 有时我得到
Initializing reader with file: /data/user/0/my-package/files/list
Reading from file: /data/user/0/my-package/files
看到了吗?似乎文件路径被某种方式切断了,我的 ifstream
正在尝试读取目录 files
.
我被告知参数 filePath
默认情况下将按值传递给线程,并且没有其他线程使用该变量,只有 filePath
在线程之后发生的事情初始化,是:
env->ReleaseStringUTFChars(_destination, filePath);
我尝试了很多不同的方法来将文件路径传递给新线程,如果我传递 filePath
之类的
std::ref(filePath)
,我会在read
函数中得到空字符串,因为变量已经在外面被清除了。
对此有何建议?
在线程完成之前调用 ReleaseStringUTFChars 将是灾难性的,因为 filePath 指向的内存也将被释放。如果你不完全理解指针和内存处理是如何工作的,我建议使用类似 std::string 的东西而不是 const char*,并且将该字符串传递给您的函数。
我正在编写一个 Android 应用程序,它使用 C++ (NDK) 读取文本文件。
我将文件 list
从 assets
文件夹复制到 /data/user/0/my-package/files/list
,在那里我可以用我的本机代码读取,复制完成后或者如果目标文件存在,我执行以下操作:
const char* fileName = env->GetStringUTFChars(_name, nullptr);
const char* filePath = env->GetStringUTFChars(_destination, nullptr);
if(copy_file(AAssetManager_fromJava(env, manager),fileName, filePath)){
Reader *r = new Reader();
log("Initializing reader with file: %s",filePath);
thread t(&Reader::read, r, filePath);
t.detach();// will crash if no detach, join() will block the UI thread.
}
还有我的 Reader::read
:
void Reader::read(const char* filePath){
log("Reading from file: %s",filePath);
ifstream infile(filePath);
string line;
while(infile>>line){
// read logic ...
}
}
有时我得到不同的输出
Initializing reader with file: /data/user/0/my-package/files/list
Reading from file: /data/user/0/my-package/files/list
一切都按预期进行。 但是 有时我得到
Initializing reader with file: /data/user/0/my-package/files/list
Reading from file: /data/user/0/my-package/files
看到了吗?似乎文件路径被某种方式切断了,我的 ifstream
正在尝试读取目录 files
.
我被告知参数 filePath
默认情况下将按值传递给线程,并且没有其他线程使用该变量,只有 filePath
在线程之后发生的事情初始化,是:
env->ReleaseStringUTFChars(_destination, filePath);
我尝试了很多不同的方法来将文件路径传递给新线程,如果我传递 filePath
之类的
std::ref(filePath)
,我会在read
函数中得到空字符串,因为变量已经在外面被清除了。
对此有何建议?
在线程完成之前调用 ReleaseStringUTFChars 将是灾难性的,因为 filePath 指向的内存也将被释放。如果你不完全理解指针和内存处理是如何工作的,我建议使用类似 std::string 的东西而不是 const char*,并且将该字符串传递给您的函数。