我想創建我自己的載體,我在開始,當編譯執行代碼,我得到「程序沒有響應」。這是代碼:自己的矢量錯誤
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, v3
的X
類的值,例如, X() : v1(0), v2(0), v3(0) { }
,該程序正常工作。
如果我改變類型,例如,Vector
的int
,他完美的作品。
如果在std::vector
中放X
班,也可以正常工作。
其他意見也被接受。
有人可以幫忙嗎?
您是否通過調試器運行測試程序以查看其堵塞的位置?你爲什麼要分配'size + 1'? – tadman
你的'clear()'函數是錯誤的,它只應該先執行'delete [];第一個= NULL;'。一個典型的矢量實現將分配一個適當大小和對齊的'char'緩衝區,並使用新的位置來實例化元素。在這種情況下,你現在的clear()實現將更接近你應該做的事情。 – Praetorian
請遵守:http://en.cppreference.com/w/cpp/language/rule_of_three –