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

标签 c++ multithreading pointers

我有一个 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/

相关文章:

c++ - 我如何在没有循环的情况下找到小于数字的两个最大幂?

c++ - 如何以这种方式使用 vector ?

android - 从 Activity 启动 IntentService 并在 IntentService 完成时刷新 Activity

c - 如何将元素添加到仅给定 head 的指针列表的末尾?

更改像素的颜色而不使用C中的 'graphics.h'库

c - 指针数组的结构地址

c++ - QML 引擎没有隐式地将 bool-string QVarient 转换为 bool 属性

c++ - 我的线程运行不正常,它给出了所有结果,最后不是一个一个地在一起,并且 GUI 在线程运行期间被挂起了吗?

java - 两个线程可以同时使用同一个套接字吗?这可能会出现问题吗?

c++ - 池化线程的 SetThreadAffinityMask