c++ new对复合字面值中的生存期的影响-a还是对地址的影响?

zdwk9cvp  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(107)

我尝试在C++11中使用初始化器列表的{}表示法来初始化静态局部常量。这个问题可能是one about temporary arrays的后续问题。可能有一个旁注(?)hinting at const(但仅适用于C99?)。另一个问题brings heap allocation into view,但我认为有区别。
其思想是让一个函数在它自己的作用域中建立一个数据结构,一个static(const)变量定义从所写的列表中取值(出于错误的意图:C风格的复合字面值)。之后,函数应该能够引用结构。上面的SO链接直接或间接地解释了为什么仅仅使用字面值是行不通的。
不过,new会有帮助吗?

int undef()
{
  static const int vs[3] {1,2,3};
  static const int* vss[2] {
    vs,
    // (const int[3]){1,2,3}          // temporary will be lost
    new const int[3] {1,2,3}
  };
  return vss[0][1] + vss[1][1];
}

我的猜测是:new将分配一个数组 somewhere,从临时的{1,2,3}初始化新的数组,然后 somewhere 继续有一个地址,所以,什么都不会丢失,对吗?
上述new的使用是否安全可靠,是否被标准?C++11所覆盖。

4dc9hkyq

4dc9hkyq1#

这是一个定义好的行为。唯一的问题是技术上的内存泄漏。没有什么会正式地delete它,但是它只会被分配一次,并且它会在整个程序的执行过程中存在。大问题。唯一实际的烦恼是静态内存清理程序报告一个“可能的”内存泄漏,就像这样。

相关问题