gpt4 book ai didi

c++ - 为什么原始指针值被覆盖/超出范围

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:55 28 4
gpt4 key购买 nike

我有一个 C++11 函数调用遗留 C 函数。我认为创建工作线程(使用 std::thread 然后将变量传递给 C 函数)会很好。但是,似乎如果线程等待执行的时间太长,那么然后指针不再指向内存中的有效位置。

示例(为了简洁/可读性而缩短,显然不是生产代码,但重现了问题):

//The C function
void c_func(const char* str1, const char* str2, const char* str3){

printf("My strings str1: %s, str2: %s, str3: %s\n", str1, str2, str3);
}

...

//C++ calling the function from numerous threads
std::vector<std::thread> threads;
std::vector<std::vector<std::string>> bar;
...
for (auto const& foo : bar)
{
threads.push_back(std::thread(c_func, foo[0].c_str(), foo[1].c_str(), (foo[0] + foo[1]).c_str()));
}

打印输出将在不同的随机时间打印输出垃圾。经过一些实验后,我注意到当我将“C 函数”更改为使用 std::string 而不是 const char* 时,这并没有发生。然而,这种变化意味着大量重写遗留代码……我宁愿不这样做……

如果线程没有及时执行,有没有办法允许这种类型的多线程调用而不指向垃圾的指针?还是我坚持重写遗留代码以将其移至 C++...

最佳答案

因为 c_str() 不会阻止字符串被清理。在函数返回并清理 bar 之后,foo 字符串也被清理,这可能在线程启动之前。

您应该传递实际的 std::string(可能传递给包装器,然后在调用 func 之前提取 char*)或其他方式确保在 join() 编辑所有线程之前字符串不会被清理。

关于c++ - 为什么原始指针值被覆盖/超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27087646/

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