2

请检查此代码,它可以编译并运行得很好。问题是,当我开始学习 c++(turbo c++)时,我从来没有能够将任何类型的数组声明为 ..

datatype var[variable_set_at_runtime];

我理所当然地认为这在最新的 gcc 编译器中是不可能的……但令人惊讶的是,这是可能的……

所以我的相关问题是新运营商的需求是什么?

我知道 new 运算符做了很多事情,包括在运行时在堆中动态分配内存,将地址返回到该资源......等等。

我觉得有什么区别是我的代码在堆栈上动态分配内存,而 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;
}

请阐明一些光..

谢谢。

4

10 回答 10

11

我理所当然地认为这在最新的 gcc 编译器中是不可能的……但令人惊讶的是,这是可能的……

它在 C 中是合法的,但在 C++ 中不合法。GCC 可能会根据编译器标志允许它,但如果您将代码编译为严格的 C++(您应该这样做),则不允许使用动态长度数组,您必须使用new. (我很惊讶还没有人提到这个小细节)

除此之外,另外两个很大的区别是:

  • 堆栈上的数据超出范围时会自动清理
  • 通常只为堆栈分配 1MB 之类的空间。大型数据结构应该放在堆上。

但实际上,最重要的一点是第一点——它不是有效的 C++。(正如 Neil 指出的那样,它在 C++0x 中也无效。没有将其添加到 C++ 的计划)

于 2009-07-03T13:19:20.313 回答
2

您必须使用new在堆上分配它:

int* ch = new int[ a ];

但不要忘记在使用后释放它:

delete [] ch;

更好的方法是使用完全符合您要求的std::vector 。

于 2009-07-03T13:14:05.270 回答
1

你会使用新的:

datatype *var=new [variable_set_at_runtime];

然后在完成后将其删除:

delete[] var;
于 2009-07-03T13:13:00.313 回答
1

现在,有 2 种不同的方法,或者您使用 new 运算符作为其他答案的建议,但这有一些问题,例如您必须确保不泄漏任何内存。

我宁愿建议使用 STL 来处理这种东西,例如列表。

这样你就不必自己处理内存管理,代码看起来更整洁。

在这里寻找一些指南:http ://www.sgi.com/tech/stl/

于 2009-07-03T13:27:28.577 回答
0

堆栈是非常小的内存。你应该只在堆栈上分配小的、临时的东西。大型或非临时对象最好分配在堆上。

是的,这将需要仔细的内存管理。

于 2009-07-03T13:12:23.980 回答
0

当分配超出范围时,“自动”分配的内容将消失。“在堆上”分配的东西new不会。

于 2009-07-03T13:12:24.853 回答
0

任何按您指定声明的变量都会放入堆栈。一旦超出范围,它将不再有效。但是,如果您使用 new 来声明您的数组,它将在堆上分配并保持有效,直到您对其调用 delete 为止。

于 2009-07-03T13:12:41.670 回答
0

您仍然需要new操作员在堆上分配东西,如果您希望它们在创建它们的函数范围之外生存,这是必需的。

就大小而言,堆栈通常也比堆更受限制,我希望看到使用可变长度数组声明方法创建的对象的链表(或任何非数组集合):-)

不,我想new可能会存在一段时间。

于 2009-07-03T13:13:31.997 回答
0

“我觉得我的代码在堆栈上动态分配内存而 new 在堆上分配内存有什么不同?这是唯一的区别......”

这正是区别。只记得。堆栈的空间有限,而堆没有任何限制(显然它有一些限制......尝试为一个分配 4 Gig ;))。一般来说,如果你知道你的堆栈分配会相对较小,那么使用你的方法,否则在堆上创建它。

于 2009-07-03T13:14:48.293 回答
0

使用_alloca。请在此处查看我对C 中的可变大小数组的回答

于 2009-07-03T13:31:03.497 回答