-1

以下代码会发生运行时错误,这可能非常容易。你会纠正它吗?

该代码用于使用列表测试 STL 库。

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

我只想运行它而不会出错。

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

// 标题

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());
    }



}
4

1 回答 1

2

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

于 2013-03-02T05:09:39.510 回答