线程函数中的c ++参数更改

c++ argument changes in thread function

我正在编写一个 Android 应用程序,它使用 C++ (NDK) 读取文本文件。

我将文件 listassets 文件夹复制到 /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*,并且将该字符串传递给您的函数。