gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:59 26 4
gpt4 key购买 nike

我有以下使用 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_visual[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 在自由存储上分配它的内存,而您不会期望相同的自由存储位置如此快地再次使用,因为您没有进行任何其他动态分配)可能是由于短字符串优化。

关于c++ - const char* 在平行区域内改变它的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22187619/

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