【问题标题】:C++ 'std::bad_alloc' what(): std::bad_allocC++ 'std::bad_alloc' 什么():std::bad_alloc
【发布时间】:2020-04-18 14:52:54
【问题描述】:

我正在尝试运行以下 C++ 代码,但出现此错误: 谁能帮我澄清一下为什么会出现这个问题 输入:input/text_4.txt 9

在抛出 'std::bad_alloc' what() 的实例后调用终止:std::bad_alloc 中止(核心转储) 在阅读了几个类似的线程后,解决方案是检查动态内存分配。但是,我的代码没有任何动态分配的内存

输入文件text_4.txt:

这是因为没有很多快乐的事情发生 在波德莱尔三个年轻人的生活中。

输入:input/text_4.txt 8

【问题讨论】:

  • 你使用std::vector。它是一个“动态数组”,可以根据需要动态分配和重新分配。
  • 第一条评论告诉你怎么做。这是程序员在这种情况下应该做的第一件事。使用调试器找出问题的根源。
  • 你有unsigned found = filepath.find_last_of("/"),然后是filepath.substr(found + 1)没有检查found的值。如果filepath 不包含“/”字符怎么办?
  • 一个可能的原因是您对scale 向量的访问之一超出范围。使用 at() 而不是 operator[] 会帮助您抓住这一点。

标签: c++ memory-management


【解决方案1】:

当我运行您的代码时,在arrangefile 的外循环的i==16 迭代中,我们得到width==8 和total==10,以及check==1。结果,even 被初始化为-2,因此while(even--) 循环(几乎)是无限的。因此它会尝试向low 添加空格,直到内存不足。

(请注意,std::string 使用的内存是动态分配的,所以您的代码确实具有动态内存分配。std::vector 也是如此。)

我没有仔细分析您的算法以找出正确的解决方法,但您的循环可能应该是 while(even-- > 0)。


我将在 cmets 中提示使用您的调试器,我将重新发布链接:What is a debugger and how can it help me diagnose problems?。这就是我发现这个错误的方式。

我在调试器gdb 下运行程序。它运行了几秒钟,此时我开始怀疑,因为该程序似乎没有做任何复杂到需要这么多计算时间的事情。所以我打断了程序(Ctrl-C),它让我看到它在哪里以及它在做什么。我可以看到它在while(even--) 循环内。这也很可疑,因为该循环应该很快完成。所以我检查了even 的值(使用命令p even),发现它是一个很大的负数。只有当它以负数开始时才会发生这种情况,这在逻辑上只有在total 大于width 时才会发生。检查它们的值,我可以看到确实如此。

也许这会对您了解有关使用调试器的更多信息有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2023-03-04
    相关资源
    最近更新 更多