2015-04-27 54 views
1

我想創建我自己的載體,我在開始,當編譯執行代碼,我得到「程序沒有響應」。這是代碼:自己的矢量錯誤

struct X 
{ 
    X(){}; 
    ~X(){}; 
    int v1, v2, v3; 
}; 

template<typename T> 
class Vector 
{ 
    public: 
    // constructors 
    Vector(); 
    Vector(unsigned s); 
    virtual ~Vector(); 

    // overloaded operators 
    T operator[](unsigned index); 

    // others 
    void clear(); 
    void add(T value); 
    unsigned getSize(); 
    bool isEmpty(); 

    private: 
    // pointer to first item of memory block 
    T* first; 
    unsigned size; 
}; 

template<typename T> 
Vector<T>::Vector() 
{ 
    first = NULL; 
    size = 0; 
} 

template<typename T> 
Vector<T>::Vector(unsigned s) 
{ 
    size = s; 
    first = new T[s]; 
}; 

template<typename T> 
Vector<T>::~Vector() 
{ 
    clear(); 
} 

template<typename T> 
void Vector<T>::clear() 
{ 
    for(unsigned i = size ; i > 0 ; i--) 
    delete &first[i]; 

    first = NULL; 
} 

template<typename T> 
void Vector<T>::add(T value) 
{ 
    T* temp = new T[size + 1]; // error happens here 

    // copy data to new location 
    for(unsigned i = 0 ; i < size ; i++) 
     temp[i] = first[i]; 

    // delete older data 
    clear(); 

    // add the new value in last index 
    temp[size + 1] = value; 

    // update the pointer 
    first = temp; 

    size++; 
} 

template<typename T> 
T Vector<T>::operator[](unsigned index) 
{ 
    return first[index]; 
} 

template<typename T> 
unsigned Vector<T>::getSize() 
{ 
    return size; 
} 

template<typename T> 
bool Vector<T>::isEmpty() 
{ 
    return first == NULL; 
} 

int main(int argc, char* args[]) 
{ 
    Vector<X> anything; 

    X thing; 

    anything.add(thing); 
    anything.add(thing); 
    anything.add(thing); // if remove this line, program work fine. 
} 

正如我評論,在錯誤發生T* temp = new T[size + 1];
如果我定義v1, v2, v3X類的值,例如, X() : v1(0), v2(0), v3(0) { },該程序正常工作。
如果我改變類型,例如,Vectorint,他完美的作品。
如果在std::vector中放X班,也可以正常工作。

其他意見也被接受。

有人可以幫忙嗎?

+0

您是否通過調試器運行測試程序以查看其堵塞的位置?你爲什麼要分配'size + 1'? – tadman

+0

你的'clear()'函數是錯誤的,它只應該先執行'delete [];第一個= NULL;'。一個典型的矢量實現將分配一個適當大小和對齊的'char'緩衝區,並使用新的位置來實例化元素。在這種情況下,你現在的clear()實現將更接近你應該做的事情。 – Praetorian

+0

請遵守:http://en.cppreference.com/w/cpp/language/rule_of_three –

回答

1

發生緩衝區溢出。

T* temp = new T[size + 1]; // When size is 0, you allocate 1 space. 

你可以分配給臨時陣列,但在位置temp[1],因爲你的陣列只有1個元素是不是有效的位置。這是undefined behavior,而這一點,你的程序可以自由選擇。在這種情況下,它似乎無限循環。

// add the new value in last index 
temp[size + 1] = value; // When size is zero, your array is length '1', but 
         // you are accessing temp[1] which is outside the 
         // bounds of your allocated memory. 
+0

'''temp [size] = value; '''解決了這個問題。是如此明顯哈哈。謝謝。 – vaati

2

你的問題的描述是非常模糊的,但我可以指出的問題與您的代碼:

  • 沒有vector拷貝構造函數(導致雙刪除和崩潰)

  • 沒有vector副本(導致雙重刪除和崩潰)

  • clear錯誤地調用delete(導致崩潰和損壞)(您應該匹配您的單一陣列的單個delete的陣列的。不要遍歷元素。
  • add是寫過去的數組的末尾(導致崩潰和腐敗)
  • 附加也不例外安全

你必須修復至少第4位。第三和第四可能是你的掛起的原因。