2017-02-19 70 views
3
int a; 
cin >> a; 
int n[a]; 

当我使用Visual Studio程序没有编译和报告错误。但是当我用终端编译程序时没有遇到任何问题。为什么这样?这是否被认为是动态内存分配?这是否被认为是动态内存分配?

+1

它是g ++的扩展...这是一个来自C99的语法。 – xinaiz

回答

10

不,这在C++11C++14中不合法。您正在使用名为variable length array的扩展名(即一些(但不是全部)编译器提供的)。

此外,VLA不适用于巨大的阵列 - 例如,几百万组件 - ,因为实际上你call stack是有限的(例如,以兆字节或几个人)

Dynamic memory allocation在内部使用类似new(或malloc)。它会更改您的进程的virtual address space(在Linux上通过system calls,比如mmap,有时会被new调用;在Windows上会使用不同的东西)。

使用动态内存的一个好的(和标准符合的)方法是使用一些standard container,如std::vector。其数据将被堆分配(并由矢量的destructor发布)。

+0

此外,任何分配一个固定大小但不包含'new'的数组在使用'new'分配之后都会消失,需要通过析构函数释放分配的空间才能高效。我说“固定”的原因是,即使使用'new',大小也必须来自某个地方,所以从技术上来说这是一个固定的大小,即使它不是针对每一个运行时 –