C++:在计算大字符串的长度时抛出“std::bad_alloc”的实例后调用终止

Posted

技术标签:

【中文标题】C++:在计算大字符串的长度时抛出“std::bad_alloc”的实例后调用终止【英文标题】:C++ : terminate called after throwing an instance of 'std::bad_alloc' while computing length of big strings 【发布时间】:2017-03-26 14:25:08 【问题描述】:

在下面的代码中,我试图计算输入字符串 s 中 a 的数量,将字符串(如果需要)重复到 n 个位置,其中 0

#include <string>
#include <iostream>


using namespace std;


int main()
    string s;
    cin >> s;
    long n;
    cin >> n;
    long len = s.length();
    long ans = 0;
    if(n <= len)
        for(long i = 0; i < n; i++)
            if(s[i] == 'a')
                ans++;
               
        
    
    else
        string comp = s;
        while(comp.length() < n)
            comp += s;
        
        long diff = comp.length() - n;
        if(diff > 0)
            while (diff == 0)
                comp.pop_back();
                diff = comp.length() - n;
            
        
        for(long i = 0; i < n; i++)
            if(comp[i] == 'a')
                ans++;
            
        
    
    cout << ans << endl;
    return 0;

【问题讨论】:

10^12 字节为 1 TB,猜猜为什么你会得到 std::bad_alloc.. 10^12 会使用大量的内存。除非您拥有像完全配置的 IBM 大型机之类的东西,否则不太可能有这么大的 RAM。 但我使用的是long 如果您要创建包含 TB 字符的字符串,则需要 TB 的 RAM。句号。该字符串在超空间中不存在。没有曲速驱动可以将弦带入其他维度。存储在字符串中的任何内容都会存储在实际内存中。此外,您希望通过以下方式完成什么:if(diff &gt; 0) while (diff == 0)。您实际上希望在哪种情况下执行 while 循环?您如何期望达到diff 大于 0,但随后神奇地变为等于 0 的情况? 鉴于您的描述,为什么所有这些代码都要做非常简单的事情? auto n = std::count(s.begin(), s.end(), 'a'); 然后std::string test(n, 'a');。即使考虑到内存分配的问题,也有很多代码可以用两到三行 C++ 来完成。 【参考方案1】:

10^12 是一个巨大的数字。即使每个项目占用 1 个字节,您也需要 1 TB 的内存。

让我们改变策略。查看下一个示例:

实例

对于 n = word.size(),这将返回 1。

如果 n = 2*word.size():

实例实例

这将返回 2:

对于 n = 3*word.size():

instanceinstance

这将返回 3:

看到这里的模式了吗?你可以用一个简单的乘法得到结果,剩下的用一个简单的循环:

std::string name;
std::cin >> name;

int n;
std::cin >> n;

int multiplier = std::count(name.begin(),name.end(),'a');

int full_iterations = n / name.size();
int last_iteration = n % name.size();

int ocurrences = multiplier * full_iterations * std::count(name.begin(),name.begin() + last_iteration,'a');

std::cout << ocurrences << std::endl;

std::count right here的文档

【讨论】:

以上是关于C++:在计算大字符串的长度时抛出“std::bad_alloc”的实例后调用终止的主要内容,如果未能解决你的问题,请参考以下文章

0xC0000005 读取二进制文件时抛出异常(C++)

S3 上传程序在尝试上传大文件时抛出异常

GTKmm3 (GTK+ 3 C++) 编译但运行时抛出 GLib-GIO-CRITICAL 错误

Firebase 函数在部署时抛出异常

计算百分比时抛出OverflowException

Azure 机器学习在运行管道时抛出错误“无效图:节点中的计算目标无效”