C++ 如何在C+;中声明一个在运行时确定了可变长度的数组+;?

C++ 如何在C+;中声明一个在运行时确定了可变长度的数组+;?,c++,new-operator,C++,New Operator,请检查这段代码,它编译和运行完全正常。。 问题是,当我开始学习C++(Turbo C++)时,我从来没有能够声明任何类型的数组,如…< /P> datatype var[variable_set_at_runtime]; 我想当然地认为这在最新的gcc编译器中是不可能的…但令人惊讶的是这是可能的 所以我的相关问题是,新运营商需要什么 我知道这个新操作符做了很多事情,包括在运行时在堆中动态分配内存,返回该资源的地址等等 我感觉到的不同之处在于,我的代码在堆栈上动态分配内存,而new在堆上动态分配

请检查这段代码,它编译和运行完全正常。。 问题是,当我开始学习C++(Turbo C++)时,我从来没有能够声明任何类型的数组,如…< /P>
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;
}
#包括
使用名称空间std;
结构A
{
INTA;
int b;
};
int main()
{
INTA;
cin>>a;
int ch[a];

对于(int i=0;i堆栈是一个非常小的内存量。您应该只在堆栈上分配小的、临时的东西。大的或非临时的对象最好在堆上分配


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

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

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

您将使用new:

datatype *var=new [variable_set_at_runtime];
然后在完成后将其删除:

delete[] var;

您仍然需要
new
操作符来分配堆上的内容,如果您希望这些内容在创建它们的函数范围之外继续存在,这是必需的

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


不,我认为
new
可能还会存在一段时间。

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

int* ch = new int[ a ];
但不要忘记在使用后将其释放:

delete [] ch;
更好的方法是使用一个完全满足您需要的方法。

“我觉得我的代码在堆栈上动态分配内存,而new在堆上动态分配内存??这是唯一的区别吗…”

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

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

它在C++中是合法的,但不是C++。GCC可能允许它依赖于编译器标志,但是如果编译代码为严格C++(应该使用),则不允许使用动态长度数组,并且必须使用<代码>新< /代码>。(我惊讶的是没有人提到这个小细节)

除此之外,还有两大区别:

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

<>但是,最重要的一点是第一个点——它不是有效的C++(正如尼尔指出的,它也不在C++ +0x中有效。没有计划将这个添加到C++)。

现在,有两种不同的方法,要么像其他答案所建议的那样使用新运算符,但也有一些问题,例如,必须确保不泄漏任何内存

我更倾向于建议使用STL来处理此类内容,例如列表

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


在这里查看一些指南:

使用alloca。在这里查看我的答案,在5分钟内得到7个响应…棒极了..:-0有趣的是:MSVC仍然不支持此功能。因此您的代码不会编译到MS world:-)而且在任何人询问之前,它似乎也不是有效的C++0x。此外,它仅在C99中是合法的。顺便问一下,C++0x的发音是什么??@ashish索尼,C++ C++ C++语言,它似乎是C++ 10而不是C++ 0x,因为没有人知道如何正确地发音C++:0xA…或者C++ 0xa……也许c++ 0xb::+)1:STL是C++中实现动态数组最合适的解决方案。像STD::vector是一个不错的替换ARARY..D.SaWLY,你认为哪个更好?(在C++中实现动态数组)在Apvector和vector之间,我发现Apvector是意外的,我发现它非常简单和方便。除非你需要它们与C库交互,否则不要使用C++中的<代码> MulcC< /Calp> <代码>免费< /COD>系列分配,除非它们不调用构造函数和析构函数。>int
数组和一个没有构造函数的POD struct数组。如果他使用第一类
,但仍然需要堆栈分配(例如,如果代码对性能敏感)然后他可以调用“代码>新的<代码>,手动调用析构函数。我是C++的新手,我已经尝试过你的建议。我只想知道我的代码是否正确。我把这个代码>删除[]CH;< /C> >在代码<主()中。函数,对吗?我的意思是,在整个代码的结尾。我只是想作为一个新手学习它,我将来会使用
std::vector