为什么返回vector <string>抛出std :: bad_alloc异常?</string>

时间:2014-06-09 13:33:45

标签: c++ std bad-alloc

以下程序适用于大多数输入,如123210122。

但是当我输入为12221112222221112221111111112221111时,它会抛出std :: bad_alloc异常。

我无法更改问题中指定的类结构或函数签名。所以看看这段代码:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class BinaryCode
{
    public:
        vector<string> decode(string q)
        {
            string p;
            int i;
            vector<string> response;
            bool flagnone=false;
            p[0]='0';
            p[1]=((q[0]-'0')-0-(p[0]-'0'))+'0';
            if(p[1]!='0' && p[1]!='1')
                response.push_back("NONE");
            else
            {
                for(i=2;i<q.length();++i)
                {
                    p[i]=((q[i-1]-'0')-(p[i-2]-'0')-(p[i-1]-'0'))+'0';
                    if(p[i]!='0' && p[i]!='1')
                    {
                        response.push_back("NONE");
                        flagnone=true;
                    }
                }
                if(!flagnone)   
                {
                    response.push_back(p.data());
                }
            }
            flagnone=false;
            p[0]='1';
            p[1]=((q[0]-'0')-0-(p[0]-'0'))+'0';
            if(p[1]!='0' && p[1]!='1')
                response.push_back("NONE");
            else
            {
                for(i=2;i<q.length();++i)
                {
                    p[i]=((q[i-1]-'0')-(p[i-2]-'0')-(p[i-1]-'0'))+'0';
                    if(p[i]!='0' && p[i]!='1')
                    {
                        response.push_back("NONE");
                        flagnone=true;
                    }
                }
                if(!flagnone)   
                {
                    response.push_back(p.data());
                }
            }
            return response;
        }
}b;
int main()
{
    string s;
    cin>>s;
    vector<string>ans = b.decode(s);
    cout<<ans[0]<<" "<<ans[1];
    return 0;
}

2 个答案:

答案 0 :(得分:2)

总结一下,你的程序有两个错误:

1。索引到空字符串

您索引为空字符串p。这可能会覆盖任何内容,例如导致其他函数bad_alloc

首先必须为字符串分配一些内存 - 例如这将创建一个与q:

相同长度的字符串
string p(q.size(), ' ');

或使用push_back创建字符串,就像使用vector一样。

2。在字符串构造函数

中使用非null终止的char *
push_back( p.data() )

p是一个字符串,数据返回const char*,但在C ++ 11之前它不会被空终止。要返回以null结尾的数据,请使用c_str()

但是,因为pstring并且您想要附加整体,所以您现在可以直接说出来:

push_back( p )

即使您使用的是C ++ 11,这也是一个更好的解决方案。

答案 1 :(得分:0)

我不确定这些是否都是问题所在,但它们是跳出来的。

string p;

这会创建一个空字符串。它有零(0)个元素。

p[0]='0';

在这里,您可以分配空字符串p的第一个元素 这是未定义的。
这意味着您的整个程序无效,任何事情都可能发生。

p[1]=((q[0]-'0')-0-(p[0]-'0'))+'0';

如果p 没有为空,未定义,则相当于

p[1] = q[0];

弄清楚为什么留下来作为练习。

并且

response.push_back(p.data());

可以替换为

response.push_back(p);

创建类BinaryCode及其实例时也没有任何意义,因为它没有状态。
C ++让你拥有免费的功能,不受课堂斗争的影响。