int a;
cin >> a;
int n[a];
当我使用Visual Studio程序没有编译和报告错误。但是当我用终端编译程序时没有遇到任何问题。为什么这样?这是否被认为是动态内存分配?这是否被认为是动态内存分配?
int a;
cin >> a;
int n[a];
当我使用Visual Studio程序没有编译和报告错误。但是当我用终端编译程序时没有遇到任何问题。为什么这样?这是否被认为是动态内存分配?这是否被认为是动态内存分配?
不,这在C++11或C++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发布)。
此外,任何分配一个固定大小但不包含'new'的数组在使用'new'分配之后都会消失,需要通过析构函数释放分配的空间才能高效。我说“固定”的原因是,即使使用'new',大小也必须来自某个地方,所以从技术上来说这是一个固定的大小,即使它不是针对每一个运行时 –
它是g ++的扩展...这是一个来自C99的语法。 – xinaiz