为动态创建的数组使用静态关键字有什么意义吗?

Is there any significance of having a static keyword for a dynamically created array?

本文关键字:什么 关键字 静态 创建 动态 数组      更新时间:2023-10-16

我可以执行此代码而不会出错。所以我相信C++允许这样做。 前任:

char *foo (char *start, int n) {
static char* temp; //Does this have any significance?
temp = new char[n];
for (int j=0; j<n; j++)
temp[(n-1)-j]=start[j];
return temp;
}
int main(){
char *c;
char a[6]={'1','2','3','4','5',''};
c = a;
int n = sizeof(a);
c = foo(c,n);
delete []c; //Does this delete the static array created in foo()?
return 0;
}

附言 - 我知道有更好的方法来反转数组,但 Q 并不关注这一点。我只是想不出一个更好的例子:)

编辑:我知道临时是在堆中创建的,我不需要使用静态。但是变量声明中的 static 关键字在内存映射等中创建动态数组时有什么不同吗?

temp变量是静态的,它存储地址的内存块是动态分配的(new char[n](和释放的(delete []c(。

它们是不同的对象。

数组不关心temp(它甚至不知道(。您可以将数组的地址存储在许多变量中;这不会以任何方式改变其行为。

我知道temp是在堆中创建的。

temp不是在堆中创建的。它是一个局部变量;局部变量不存储在堆中。

static char* temp; //Does this have any significance?

static关键字使temp成为永久变量,该变量自程序启动到结束一直存在。static关键字可确保在函数结束时不会丢失其值。每次执行函数foo()时(第一个函数除外(,temp的值与上次运行时的值相同。

但是,作为局部变量,temp仅在foo()函数中可用。

temp的值是一个内存地址。使用new char[n]分配的块的地址。此内存块在堆中分配,并且在释放(使用delete []c(之前有效。它也可以从main()访问,因为它的地址在main()函数中以某种方式可用。它是可用的,因为对foo()函数的调用会返回它并main()将其存储在c中。

delete []c; //Does this delete the static array created in foo()?

不,它只删除(实际上是版本(数组(在foo()中创建(。静态变量(temp(不会受到任何影响。

您使用new[]分配了一些内存,并使用delete[]释放了它。这是你应该做的。您可以根据需要操作指向该内存的指针,只要您将从new[]获得的相同值传递给delete[]即可。

你的函数应该(并且正在(返回它从new[]获得的值。如果需要,它可以将其临时存储。错误返回指向临时的指针或引用。返回临时值是可以的 - 否则几乎不可能返回除常量或指针或对通过引用或全局传递的参数的引用之外的任何内容。