個人曾經出錯問題小結。

細心,嚴密,嚴謹,耐心,不浮躁。
(1)包含指針或引用的類,要重寫拷貝構造函數,和賦值函數。不然是默認按成員拷貝很容易出錯。
(2)使用STL容器的時候,要小心iterator的失效問題:例如 
vector<int>::iterator it = v.begin(); 
for(int i = 0; i<100; i++) v.push_back(i);
此時it可能已經失效,因爲有可能v.push_back(i)會引起由於分配空間不足,而重新分配內存空間的操作。it變成了也指針。
最好是在後面 在初始化it一次 vector<int>::iterator it = v.begin(); 

(3)刪除字符串數組的時候要用delete[] 例如 char p[] = "abcde"; delete []p;
(4)operator=的賦值函數,如果類裏面有指針,則要先用臨時變量先分配好內存,把對象拷貝到臨時對象裏,釋放原指針所指向的內容。再把臨時的指針變量賦值給原指針。
class Test
{
    public:
        Test();
        virtual ~Test();
        Test& operator = (const Test& other) {
            if(this != &other) {
                char *temp = new char[strlen(other.m_data) + 1];
                strcpy(temp,other.m_data);
                delete []m_data;
                m_data = temp;
            }
            return (*this);
        }
    private:
        char *m_data;
};

(5) new 返回的是一個指針。函數返回值爲const的時候,也只能指派給const,注意const的使用。函數的參數如果是引用,實參穿的時候是一個對象,而不是一個指針。

(6)const容器對象的迭代器也要使用const_iterator,不然編譯會出錯。
(7) 輸入參數的合法判斷,特別是指針的時候,返回值的判斷,特別是指針的時候,不能返回指向棧內內存的指針。
(8) iterator無法使用泛型。 例如
template<typename T>
void print_container(vector<T> t) {
    vector<T>::iterator it;                  //編譯錯誤
    for(; it != t.end(); it++) {
        std::cout << *it << " ";
    }
    std::cout << "\n";
}
錯誤修正,加個typename
using namespace std;
template <typename T>
void print_container(T& t) {
    typename T::iterator it = t.begin();
    for(; it != t.end(); it++) {
        std::cout << *it << std::endl;
    }
    std::cout << "\n";
}
(9)心態:逐步分析你出現的錯誤,看清楚錯誤信息,不要急着更改。

(10)嵌套定義的問題。
如果一個類A裏面使用了另外一個類B的成員,A類的實現在類B的定義前面則會出錯。因爲A只知道有這個類B,而類B裏面有什麼成員A還不知道,在A裏面使用了B的成員就出錯了。
class A;
class B {
public:
     void test ( A::iterator &it);    //出錯,B目前並不知道有A中有嵌套類型 iterator的存在
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章