const char *在平行区域内改变它的值

时间:2014-03-05 03:00:56

标签: c++ openmp

我使用OpenMP

有以下C ++代码
int number_of_frames = 200;

stringstream ss_n_frames;
ss_n_frames << number_of_frames;
const char *argv_visual[] = { "program_name" , ss_n_frames.str().c_str() };
std::cout << "\nargv[0] = "<<argv_visual[0];
std::cout << "\nargv[1] = "<<argv_visual[1];

#pragma omp parallel sections shared(number_of_frames)
{
     #pragma omp section
     {
        std::cout << "\n[Parallel region] argv[0] = "<<argv_visual[0];
        std::cout << "\n[Parallel region] argv[1] = "<<argv_visual[1];
     }

     #pragma omp section
     {
        // doing things that has nothing to do with argv_visual
     }
}

以下是我在终端中看到的内容

argv[0] = program_name
argv[1] = 200
[Parallel region] argv[0] = program_name
[Parallel region] argv[1] = !

所以&#34; argv_visual [1]&#34;的价值在平行区域内发生了变化,有谁知道为什么?

修改

以下列方式修复:

stringstream ss_n_frames;
ss_n_frames << number_of_frames;
string string_n_frames = ss_n_frames.str();
const char *constchar_n_frames = string_n_frames.c_str();

const char *argv_visual[] = { "program_name" , constchar_n_frames };

1 个答案:

答案 0 :(得分:1)

在这一行:

ss_n_frames.str().c_str()

您正在获取指向临时字符串内容的指针,该字符串在语句末尾(最迟)被销毁,然后尝试读取未定义行为的内存。要解决此问题,请创建ss_n_frames.str()的非临时副本并将其打印出来。

如果我们想推测,它仍然不打印字符串的原因(因为string在免费商店分配其内存而你不会期望使用相同的免费商店位置再这么快,因为你没有做任何其他的动态分配)可能是由于短串优化。