constchar*在平行区域内更改其值

const char* changing it vallues when inside parallel region

本文关键字:区域 constchar      更新时间:2023-10-16

我有以下使用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] = !

所以"argv_vision[1]"的值在视差区域内发生了变化,有人知道为什么吗?

编辑

通过以下方式修复:

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 };

在行中:

ss_n_frames.str().c_str()

您得到的指针指向一个临时字符串的内容,该字符串在语句结束时(最晚)被销毁,然后尝试读取内存,这是未定义的行为。要解决此问题,请创建ss_n_frames.str()的非临时副本,然后打印该副本。

如果我们想推测一下,它无论如何都不打印字符串的原因(因为string在空闲存储上分配内存,并且你不会期望如此快地再次使用相同的空闲存储位置,因为你没有进行任何其他动态分配)可能是由于短字符串优化。