【问题标题】:Unknown application failure during vector initialization矢量初始化期间出现未知的应用程序故障
【发布时间】:2015-12-11 10:37:03
【问题描述】:

我正在尝试如下初始化向量:

vector<int> vect(n, 2);

此语句初始化 vect 以包含 n 类型为 int 且值为 2 的元素。 nsize_t 类型的变量,已检查以确保 n &lt;= vect.max_size() 始终为真。

目前我正在 Code::Blocks 上测试我的代码。它适用于n 的任意小值,但是当我尝试在n = vect.max_size() 的IDE 中运行它时,程序终止,说发生了未知的应用程序错误,并与开发人员(我)交谈。

有谁知道怎么回事?这不是将向量初始化为运行时可能的最大大小的正确方法吗?我检查了一下,我的数学是正确的,n 没有超过vect.max_size()

【问题讨论】:

  • 如果你尝试vect.max_size() - 10会发生什么?它可能有助于阐明这个问题。
  • 你有 17 GB 的内存吗?
  • 当您创建一个指定大小的向量类型变量时,所有内存将立即分配... max_size() 函数返回给您这个向量可以有多大,而不管您当前的内存大小。 ..所以目前您在堆上分配 GB 的内存,而您只是用完了资源...
  • 如果超过max_size(),分配将总是失败。如果您低于max_size(),有时分配可能会起作用。它工作的几率越大,你得到的越远,你之前完成的其他分配就越少。所以,不是一个非常有用的功能......
  • 有没有一种好方法可以确定 n 的最大运行时间是多少,或者至少是一个接近且安全的近似值?这就是我在使用 max_size 时真正想要做的事情,因为我认为与更理论上的 (size_t)-1 相比,这是一个实际限制

标签: c++ vector initialization


【解决方案1】:

max_size() 成员在某种程度上是理论上的限制。在具有大量内存的机器上,可能可以创建具有相应大小的容器,但通常使用现代技术是不可能的。

max_size() 存在的原因几乎消失在历史的迷雾中。我怀疑当开发 STL 并且使用“小”指针(类似于 __small int*)实例化容器时,该值有点意义:大约在那个时候,一些平台具有不同的指针类型大小,例如,一个 16 位“小”和一个 32 位“大”指针。

我认为没有一种实用的方法来确定可以分配的容器的最大大小。充其量你可以做一些类似二分搜索的事情,尝试创建一个具有一定大小的容器并捕获std::bad_alloc:很可能是你的“应用程序错误”和该类型的未捕获异常。

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 2011-11-03
    • 2015-08-15
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2020-12-15
    • 2021-04-28
    相关资源
    最近更新 更多