c++ - 不同方式的动态数组声明

标签 c++ arrays heap-memory

我知道 int* array = new int [n]; 在堆中分配内存空间。

但是如果我声明这样的东西:int array[n]; 在代码块中它编译成功,但是如果我将它移到 visual studio 中,它就会出错。

我想问的是:

  1. int[n] 的真正作用是什么?它与堆分配相比如何?它们有什么区别?

  2. 如果我使用 int array[n] 而不是 int* array = new int [n]; 会出现什么错误?

最佳答案

int array[n] 在栈上声明一个数组,而不是在堆上。在标准 C++ 中,n 必须是一个编译时常量,但是一些编译器有一个扩展,允许以这种形式声明的可变长度数组没有编译时常量 n。它不是标准的,可能不应该使用。

int array[n] 可能会在 int* array = new int [n]; 上引起一些问题:

  • 如果 n 足够大,您可能会导致堆栈溢出。或者,如果该数组是一个类成员,而您创建了该类的大型数组。
  • 如果 array 是类成员,移动 可能与复制 一样昂贵
  • 如果 array 是一个类成员并且您已经给出了指向该数组的指针并移动 类,那么这些指针现在指的是一个移动后的对象,或者如果如果对象也被销毁,则为随机内存。无论哪种方式,都不好。

关于c++ - 不同方式的动态数组声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15314213/

相关文章:

c# - 如何在 C# 中获取对多维数组的单个维度的引用?

java - 如何计算 GC 工作所需的 oldGen 的大小?

c++ - 即使我涵盖了所有情况,也会收到 "control reaches end of non-void function"警告

c++ - 在 C++ 构造函数中分配内存的正确方法是什么?

c 打印太多字符

arrays - 根据另一个 numpy 的 bin 对一个 numpy 数组求和

c - 如何在 Linux 中限制 C 代码的堆大小

java - JVM 内存中特定对象的子树的大小

c++ - '! image.data' 在 C++ 中是什么意思?

c++ - IIS 的自定义日志记录模块