constchar*在平行区域内更改其值
const char* changing it vallues when inside parallel region
我有以下使用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
在空闲存储上分配内存,并且你不会期望如此快地再次使用相同的空闲存储位置,因为你没有进行任何其他动态分配)可能是由于短字符串优化。
相关文章:
- 将QGraphicsItem的移动区域限制在多边形区域内
- 为constchar*定义std::begin合法吗
- 有没有一种优雅而快速的方法来测试整数中的 1 位是否位于连续区域
- 在 Linux 中存储区域设置名称的缓冲区大小应该是多少?
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 提升区域设置规范化带状字符,但不规范化重音
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 我可以将新的 std::tuple 放入内存映射区域,并在以后读回吗?
- 英特尔将指令存储在重叠的内存区域
- 如何给主窗口区域DKGRAY_BRUSH?
- 矢量擦除多个区域,2 x 擦除与单个分配?
- 错误:创建对象后无法分配区域
- 是否有任何区域设置会影响宽字符编码?
- GTKMM:拍摄绘图区域的屏幕截图?
- GTKMM:如何将键盘事件附加到绘图区域?
- 在 mmap'ed 区域上使用 memcpy 崩溃,for 循环不会
- 创建一个类来访问和指定向量类型,并构建一个获取位置并为其分配区域的类
- 当DPI感知,全屏和无框时,客户区域在WM_NCACTIVATE上擦除
- 提升获取文本的区域设置"Conversion failed"
- constchar*在平行区域内更改其值