我正在尝试创建我自己的 vector ,我在开始,当编译和执行代码时,我得到“程序没有响应”。这是代码:
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];
中。
如果我定义 X
类的 v1, v2, v3
的值,例如X() : v1(0), v2(0), v3(0) { }
,程序运行正常。
如果我更改类型,例如 int
的 Vector
,他会完美地工作。
如果将 X
类放在 std::vector
中,也可以正常工作。
也接受其他意见。
有人可以帮助我吗?
最佳答案
您对问题的描述非常模糊,但我可以指出您的代码存在的问题:
没有
vector
复制构造函数(导致双重删除和崩溃)没有
vector
复制赋值(导致双重删除和崩溃)clear
错误地调用了delete
(导致崩溃和损坏)(您应该将数组的单个new
与单个匹配>删除
数组。不要遍历元素。add
写入数组末尾(导致崩溃和损坏)- 添加不是异常安全的
您必须至少修复前四个问题。第三个和第四个可能是你挂起的原因。
关于c++ - 自 vector 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29902003/