初始化向量时检查错误的alloc

时间:2018-05-03 14:01:02

标签: c++ vector heap

由于我已经读过向量中的每个元素都是在堆上创建的,我想知道你是否需要检查堆上是否有足够的内存,或者如果没有足够的可用空间会发生什么?

例如这样甚至是必要的吗?:

   try {
       std::vector<T> map;
       map.pushback(t);
    } catch (const std::bad_alloc& e) {
        std::cout << "Allocation failed: " << e.what() << '\n';
    }

3 个答案:

答案 0 :(得分:4)

在大多数情况下,您将获得std::bad_alloc抛出的场景是您尝试分配过多内存的场景,系统没有任何内容可供使用。在大多数情况下,这不是可恢复的错误。将整个程序包装在try-catch块中可能会发出错误消息("System ran out of memory!")可能是有意义的,但在大多数情况下,它不值得捕获此错误,因为它有&#39; s不会成为你的计划的明智的恢复选择。

但请注意我在这里对冲我的语言。这完全取决于您使用的应用程序类型。例如,如果您正在编写一个程序,根据可用内存量来调整自身(可能它会尝试分配64GB内存,但如果它可以,那么它只是写入/读取临时文件?在try-catch块中包装这样的分配可能是合乎逻辑的,并为内存分配失败的场景添加逻辑。

当您花费更多时间编写代码时,您需要捕获此错误的方案与您不在的方案之间的差异将变得更加明显。

答案 1 :(得分:2)

  

例如这样甚至是必要的吗?:

documentation

中所述
  

如果抛出异常(可能是由于Allocator :: allocate()或元素复制/移动构造函数/赋值),则此函数无效(强异常保证)。

所以push_back()会在重新分配时抛出此类异常。如果你需要在每次通话时检查它真的取决于你的应用程序逻辑,所以没有人可以告诉你是否有必要,但你。

答案 2 :(得分:1)

  

因为我已经读过载体中的每个元素都是在堆上创建的

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> </exclusions> </dependency> 拥有堆分配的连续缓冲区。元素被添加到缓冲区。每个元素都不是单独分配的。

如果缓冲区已满,std::vector会自动分配一个更大的缓冲区,并将旧元素从旧元素移动到新元素。

  

例如这样甚至是必要的吗?

它可能有点过分,除非您希望std::vector出于某种原因消耗所有可用内存。处理push_back在某些情况下可能很有用,但大多数情况下内存耗尽并非您想要恢复的内容 - 这完全取决于您正在处理的程序类型。

您可能也希望在std::bad_alloc块中执行一些有意义的操作 - 打印将无法解决问题。