Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 动态声明数组后面的静态声明_C++_Static_New Operator - Fatal编程技术网

C++ 动态声明数组后面的静态声明

C++ 动态声明数组后面的静态声明,c++,static,new-operator,C++,Static,New Operator,我想在一个函数中有一个数组,当我退出函数时,它会保留它的值,例如- int func(int x) { static int arr[5]; } 但问题是我事先不知道数组的大小(即它取决于x)。因此,我必须使用“new”声明一个数组 可以这样做吗 static int *arr=new int[x]; 或者我必须做: static int *static arr = new int[x] 如果没有,那么 怎么做?我认为这不合法。 可以使用变量在函数范围内“动态”调整数组大

我想在一个函数中有一个数组,当我退出函数时,它会保留它的值,例如-

 int func(int x)
 {
  static int arr[5];
 } 
但问题是我事先不知道数组的大小(即它取决于x)。因此,我必须使用“new”声明一个数组

可以这样做吗

 static int *arr=new int[x];
或者我必须做:

  static int *static arr = new int[x]
如果没有,那么 怎么做?

我认为这不合法。 可以使用变量在函数范围内“动态”调整数组大小的原因是因为数组被放在堆栈上:

void foo(int x)
{
   int bar[x]; // this is legal
} // but goes out-of-scope here :-(
声明数组
static
会破坏此功能。可以这样想:链接器没有机会知道数组的大小,因此无法定位“超出”数组的任何内容(显然不可取)


因此,基本上您需要通过
new
delete
使用堆。或者更好地使用前面建议的
std::vector
(在内部使用heap)。

static int*arr=new int[x]正常。但是,您需要担心内存泄漏,因为
delete[]arr


如注释中所述,本地
静态std::vector arr
是首选,因为它的析构函数在程序结束时自动调用。

首选使用
静态std::vector
。使用
静态std::vector
。这看起来很尴尬,因为x在不同的调用中可能有不同的值。如果第一次调用时x为1,而您分配了一个包含1个元素的数组,那么下次x为2会怎么样?@timrau…如果arr不是静态的,那么一旦我们退出函数,它就会被销毁…那么我们将如何访问数组元素?@avinash不可能。因此,您应该找到一些方法让调用者访问地址,例如
returnarr
,将其分配给
int**
参数,或者甚至将其分配给全局
int*
(尽管是最糟糕的方式)这是非法的,因为代码GX*X/Cube不是在编译时决定的,尽管GCC扩展允许它。Hmm,它可能在C++中是非法的吗?它在C(C99)中是允许的。