这被认为是动态内存分配吗?

3
int a;
cin >> a;
int n[a];

我使用Visual Studio编译程序时出现错误报告,但是当我使用终端编译时,程序可以正常运行,为什么会这样?这算不算动态内存分配?


1
这是g++的扩展... 这是来自C99的语法。 - xinaiz
1个回答

10
不行。在C++11C++14中这是不合法的。你正在使用一个被称为可变长数组的扩展(某些编译器提供,但并非全部)。
此外,对于大型数组,如数百万个组件的数组,VLA效果不佳,因为实际上你的调用栈是有限制的(例如,仅有一兆字节或几个字节)。

动态内存分配实际上使用类似new(或malloc)的东西。它通过系统调用(例如在Linux上通过mmap,有时会被new调用;在Windows上使用不同的东西)来改变进程的虚拟地址空间

使用动态内存的好方法(符合标准的方法)是使用一些标准容器,例如std::vector。它的数据将在堆上分配(并由向量的析构函数释放)。


另外,任何使用固定大小分配但没有使用“new”的数组,在对象销毁后都将消失,而使用“new”进行分配需要通过析构函数释放已分配的空间以实现高效。 我之所以说“固定”,是因为即使您使用“new”,大小也必须来自某个地方,因此从技术上讲,即使它不是针对每个单个运行时固定的大小,它也是一个固定的大小。 - Kostas Andrianos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接