为动态创建的数组使用静态关键字有什么意义吗?
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',' '};
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[]
获得的值。如果需要,它可以将其临时存储。错误返回指向临时的指针或引用。返回临时值是可以的 - 否则几乎不可能返回除常量或指针或对通过引用或全局传递的参数的引用之外的任何内容。
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- "friend"关键字在C++中是什么意思?
- 有什么技巧可以避免在模板类中使用"typename"关键字吗
- 关键字使用的功能是什么?
- 为动态创建的数组使用静态关键字有什么意义吗?
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- ELI5 函数名称后面的"&&"关键字是什么意思
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- 静态关键字有什么用
- 什么是消除歧义的关键字模板
- 内联函数 - 相对于内联关键字,它们到底是什么
- "using"关键字在 c++ 中究竟有什么作用?
- 使用关键字,我做错了什么
- 自动C 关键字有什么作用
- 作为返回类型的枚举关键字的存在表明什么
- 'protected'关键字在联合中有什么用?
- C++中"using"关键字背后的逻辑是什么?
- 关键字 static 在 C 和 C++ 之间有什么区别?
- c++ 类访问关键字"signals"是什么意思?