使用列表STL进行测试时出现复制构造函数错误

时间:2013-03-02 04:59:26

标签: c++ copy-constructor

以下代码出现运行时错误,这可能非常简单。 你能纠正它吗?

该代码用于测试带有列表的STL库。

问题看起来源于两个函数,即Test :: Test(const Test& t)
 和测试& Test :: operator =(const Test& m)。

我想在没有错误的情况下运行它。

如果您确切知道问题发生的原因,请告诉我原因。

// header

class Test
{
public:
    int t;
    char *name;

public:
    Test() {
        t = 1;
        name = new char [strlen("test")+1];
        strcpy(name, "ssss");
    }
    Test (int i) {
        t = i;
    }

    Test(const Test& t);              
    ~Test()
    { 
        delete [] name;
    }
    Test& operator= (const Test& m);

    char * get_name();
};

//实施

Test::Test(const Test& t)
{
    this->t = t.t;
    this->name = new char[strlen(t.name)+1];
    strcpy(this->name, t.name);
}

Test& Test::operator= (const Test& m)
{
    if(this == &m) return *this;

    if(this->name != NULL) delete[] name;

    name = new char[strlen(m.name)+1];
    strcpy(this->name, m.name);

    this->t = m.t;

    return *this;
}

char * Test::get_name()
{
    return name;
}

//主要功能

int main(int argc, const char * argv[])
{   
    Test a;
    Test b(3);
    Test c(4);

    list <Test> t_list;
    t_list.push_back(a);
    t_list.push_back(b);
    t_list.push_back(c);

    list <Test>::iterator iter_begin = t_list.begin();
    list <Test>::iterator iter_end = t_list.end();

    for(; iter_begin != iter_end; iter_begin++)
    {
        printf("%d\n", iter_begin->t);
        printf("%s\n", iter_begin->get_name());
    }

    list <Test> t_list2;
    t_list2.push_back(c);
    t_list2.push_back(b);
    t_list2.push_back(a);

    iter_begin = t_list2.begin();
    iter_end = t_list2.end();

    for(; iter_begin != iter_end; iter_begin++)
    {
        printf("%d\n", iter_begin->t);
        printf("%s\n", iter_begin->get_name());
    }



}

1 个答案:

答案 0 :(得分:2)

您的Test(int)构造函数未初始化name。这会导致所有其他问题。 (快速运行valgrind就会告诉你。)