为动态创建的数组设置静态关键字有什么意义吗?
Is there any significance of having a static keyword for a dynamically created array?
我可以无误地执行这段代码。所以我相信 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','[=10=]'};
c = a;
int n = sizeof(a);
c = foo(c,n);
delete []c; //Does this delete the static array created in foo()?
return 0;
}
P.S.- 我知道有一种更好的方法来反转数组,但 Q 并不专注于此。我只是想不出一个更好的例子。:)
编辑:我知道临时文件是在堆中创建的,我不需要使用静态文件。但是在内存映射等中创建动态数组时,变量声明中的 static 关键字有什么不同吗?
您使用 new[]
分配了一些内存,并使用 delete[]
释放了它。那是你应该做的。只要将从 new[]
.
获得的相同值传递给 delete[]
,您就可以随意操作指向该内存的指针
您的函数应该(并且正在)returning 它从 new[]
获得的值。如果需要,它可以将其临时存储。错误是 return 指向临时对象的指针或引用。返回临时值很好——否则几乎不可能 return 除了常量或指针或对通过引用或全局传递的参数的引用之外的任何东西。
temp
变量是静态的,它存放地址的内存块是动态分配(new char[n]
)和释放(delete []c
)的。
它们是不同的对象。
数组不关心 temp
(它甚至不知道)。您可以将数组的地址存储在许多变量中;这不会以任何方式改变它的行为。
I understand temp
gets created in heap.
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()
函数的调用 returns 它和 main()
将它存储在 c
.
delete []c; //Does this delete the static array created in foo()?
不,它只删除(实际上是释放)数组(在 foo()
中创建)。静态变量 (temp
) 不受影响。
我可以无误地执行这段代码。所以我相信 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','[=10=]'};
c = a;
int n = sizeof(a);
c = foo(c,n);
delete []c; //Does this delete the static array created in foo()?
return 0;
}
P.S.- 我知道有一种更好的方法来反转数组,但 Q 并不专注于此。我只是想不出一个更好的例子。:)
编辑:我知道临时文件是在堆中创建的,我不需要使用静态文件。但是在内存映射等中创建动态数组时,变量声明中的 static 关键字有什么不同吗?
您使用 new[]
分配了一些内存,并使用 delete[]
释放了它。那是你应该做的。只要将从 new[]
.
delete[]
,您就可以随意操作指向该内存的指针
您的函数应该(并且正在)returning 它从 new[]
获得的值。如果需要,它可以将其临时存储。错误是 return 指向临时对象的指针或引用。返回临时值很好——否则几乎不可能 return 除了常量或指针或对通过引用或全局传递的参数的引用之外的任何东西。
temp
变量是静态的,它存放地址的内存块是动态分配(new char[n]
)和释放(delete []c
)的。
它们是不同的对象。
数组不关心 temp
(它甚至不知道)。您可以将数组的地址存储在许多变量中;这不会以任何方式改变它的行为。
I understand
temp
gets created in heap.
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()
函数的调用 returns 它和 main()
将它存储在 c
.
delete []c; //Does this delete the static array created in foo()?
不,它只删除(实际上是释放)数组(在 foo()
中创建)。静态变量 (temp
) 不受影响。