【问题标题】:vector<int> a[n] allocated in stack or heap? Difference between the declarations vector<vector<int>>a(n) and vector<int>a[n]? [duplicate]vector<int> a[n] 在堆栈或堆中分配?声明 vector<vector<int>>a(n) 和 vector<int>a[n] 之间的区别? [复制]
【发布时间】:2017-09-07 18:21:38
【问题描述】:

当我声明vector> a(n)时,内存是在堆中分配的,而当我声明它vector a[n]时,它是在堆栈上分配的。但为什么?第二个不是意味着方式 - a[i] 是指向第 i 个向量的指针,因为向量是在堆中动态分配的,因此整个分配应该在堆中。不是吗?

如果我错了,你能解释一下吗?

【问题讨论】:

  • VLA 不是 C++ 的一部分,在 C++ 模式下一些编译器支持的是 C。
  • 这是一个 VLA 变体:stackoverflow.com/questions/1847789/…
  • 好点jxh。我应该去找那个骗子,而不是试图回答。
  • 本主题的主题应该是“Welcome to Stack Overflow”,具有双重含义...
  • 如果你知道向量是动态数组,为什么不按常识做一个vector的向量(动态数组)呢?

标签: c++ arrays vector


【解决方案1】:
vector<int> adj[n];

这不是合法的 C++ 代码,你不能像这样在栈上声明一个动态大小的数组。

这也可能是您的问题的原因,因为在堆栈上进行如此巨大的分配可能会导致一些重大问题。

您应该改用以下内容:

vector<vector<int>> adj(n);

【讨论】:

  • 这不能回答问题。虽然这句话是正确的,但它显然是他的编译器支持的扩展,并不是他的问题的真正原因。
  • 是的,它对某些编译器是合法的。虽然我自己从来没有遇到过。
  • @zzyz 一些允许你这样做的编译器并不使它成为合法的 C++。否则,任何未定义的行为或严格的别名违规都可以这样说。
  • @MartinBonner 添加了关于为什么我认为这是 OP 试图解决的问题的根源的解释。谢谢!
  • @Frank 够公平,并根据您的编辑对您的答案投了赞成票。
【解决方案2】:

如前所述,

vector<int> adj[n];

不是标准的 C++,但是一些编译器 (GCC) 允许它作为扩展。

然而,这样的数组是在堆栈上创建的,你可能会看到堆栈溢出(双关语)——堆栈通常比堆内存小得多。

【讨论】:

    猜你喜欢
    • 2020-07-15
    • 2020-12-27
    • 2021-11-07
    • 2021-08-26
    • 1970-01-01
    • 2016-05-30
    • 2022-08-07
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多