在抛出'std :: length_error'的实例后调用cout导致终止

时间:2015-05-19 12:11:01

标签: c++

当我运行程序时崩溃时出现以下错误:

  

在抛出'std :: length_error'的实例后终止调用     what():basic_string :: _ S_create   中止(核心倾销)

我通过以下代码得到它:

#include <iostream>
#include <string>
using namespace std;

class Cargo
{
    string nm;
public:
    Cargo(const string& name): nm(name)
    {

    }
    Cargo& operator=(const Cargo& )
    {
        cout<<"inside Cargo::operator=()"<<endl;
        return *this;
    }

    friend ostream& operator<<(ostream& os, const Cargo& ca)
    {
        return os<<"Cargo name: "<<ca.nm;
    }
};

class Truck
{
    Cargo b;
    string name;
public:
    Truck(const string& nm):b("Cargo" + name)
    {
        name = nm;
    }

    void print()
    {
        cout << "name: " << name << endl;
        cout << b << endl;
    }
};

int main()
{
    Truck a("Truck a"), b("Truck b");
    a = b;
    a.print();
    b.print();
}///~:

2 个答案:

答案 0 :(得分:1)

Truck构造函数中:

Truck(const string& nm):b("Cargo" + name)
{
    name = nm;
}

您要将b类的name属性作为参数发送给Truck,该属性未初始化。我想您想要传递nm参数:

Truck(const string& nm):b("Cargo" + nm)
{
    name = nm;
}

答案 1 :(得分:1)

在卡车中你有b("Cargo" + name)。由于您尚未输入构造函数,因此name尚无值。如果将其更改为b("Cargo" + nm),它将修复运行时erorr。请参阅this实例

您还应该将初始化列表中的name初始化为:

Truck(const string& nm):b("Cargo" + nm), name(nm) {}

有一个空构造函数是可以的,我更喜欢这样做,因为它显示所有构造函数正在做的是初始化成员变量而不是其他任何东西。