请检查此代码编译并运行绝对正常.. 问题是,当我开始学习c ++(turbo c ++)时,我永远无法将任何类型的数组声明为...
datatype var[variable_set_at_runtime];
我理所当然地认为这在最新的gcc编译器中是不可能的......但令人惊讶的是这是可能的......
所以我的相关问题是什么需要新的操作符呢?
我知道new运算符可以执行很多操作,包括在堆中运行时动态分配内存,将地址返回给该资源......等等。
我觉得有什么区别是我的代码动态地在堆栈上分配内存而新的代码在堆上呢?这是唯一的区别......
在写完这样的东西之后,我真的很惊讶,因为当我开始学习c ++时,我无法做到这一点......为了添加它,我也能为自定义数据类型做到这一点......: - O#include<iostream>
using namespace std;
struct A
{
int a;
int b;
};
int main()
{
int a;
cin>>a;
int ch[a];
for(int i=0;i<a;i++)
ch[i]=i+1;
for(int i=0;i<a;i++)
cout<<"\n\nch=="<<ch[i];
A obj[a];
cin>>obj[a-1].a;
cin>>obj[a-1].b;
cout<<"\n\n obj.a,obj.b=="<<obj[a-1].a<<" , "<<obj[a-1].b;
}
请说清楚..
感谢。
答案 0 :(得分:11)
我认为这是理所当然的 在最新的gcc中是不可能的 编译器...但令人惊讶的是这是 可能...
它在C中是合法的,但不是C ++。 GCC可能允许它取决于编译器标志,但如果您将代码编译为严格的C ++(您应该),则不允许使用动态长度数组,并且必须使用new
。 (我很惊讶没人提到这个小细节)
除此之外,另外两个很大的区别是:
但实际上,最重要的一点是第一点 - 它不是有效的C ++。 (正如Neil指出的那样,它在C ++ 0x中也无效。没有计划将其添加到C ++中)
答案 1 :(得分:2)
答案 2 :(得分:1)
你使用新的:
datatype *var=new [variable_set_at_runtime];
然后在完成后将其删除:
delete[] var;
答案 3 :(得分:1)
现在,有两种不同的方法,要么你使用new运算符,因为其他答案已经建议,但是有一些问题,例如你必须确保不泄漏任何内存。
我宁愿建议使用STL来处理这类内容,例如列表。
这样您就不必自己处理内存管理,代码看起来更整洁。
在这里查看一些指南:http://www.sgi.com/tech/stl/
答案 4 :(得分:0)
堆栈是一个非常少量的内存。您应该只在堆栈上分配小的临时事物。可以在堆上分配大型或非临时对象。
是的,这需要仔细的内存管理。
答案 5 :(得分:0)
当分配超出范围时,“自动”分配的内容将消失。使用new
“在堆上”分配的内容不会。
答案 6 :(得分:0)
任何声明为您指定的变量都放在堆栈中。一旦超出范围,它将不再有效。但是,如果使用new来声明数组,它将在堆上分配并保持有效,直到您在其上调用delete。
答案 7 :(得分:0)
你仍然需要new
运算符来分配堆上的东西,如果你希望它们超出它们创建的函数的范围,这是必需的。
在大小方面,堆栈通常也比堆大得多,我很乐意看到使用可变长度创建的对象的链表(或任何非数组集合)数组声明方法: - )
不,我认为new
可能会持续一段时间。
答案 8 :(得分:0)
“我觉得我的代码是什么区别是我的代码动态地在堆栈上分配内存而新的在堆上执行?这是唯一的区别......”
完全不同。只记得。堆栈的空间有限,而堆没有任何限制(显然它有一些限制......尝试为一个进行4 Gig分配;))。一般来说,如果你知道你的堆栈分配相对较小,那就使用你的方法,否则在堆上创建它。
答案 9 :(得分:0)
使用_alloca。请参阅此处的Variable Sized Arrays in C
答案