2013-03-02 37 views
-1

以下代碼會發生運行時錯誤,這可能非常容易。 你會糾正它嗎?使用列表STL測試期間的複製構造函數錯誤

該代碼是用於測試列表的STL庫。

問題看起來,它從所述兩個功能,這是測試::測試(常量測試&噸)
和測試&測試::運算=(const的試驗&米)的莖。

我想運行它沒有錯誤。

如果您完全知道問題出現的原因,請告訴我原因。

//頭

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



} 
+0

什麼是錯誤? – Ares 2013-03-02 05:19:28

+0

更正將使用'std :: string'。看到我的答案。 – juanchopanza 2013-03-02 06:52:11

回答

2

Test(int)構造函數不初始化name。這會導致所有其他問題。 (快速運行valgrind本來會告訴你的。)