我目前正在制作“向量”类。
template <typename T>
class Vectors{
private:
int size_;
public:
int size_;
T *elements;
Vector(){
size_=0;
T *elements=new T[size_];
}
Vector(int size){
size_=size;
T *elements=new T[size_];
}
void push_back(T amaze){
//make new temporary pointer;
T *Temp=new T[size_+1];
size_=size_+1;
for(int i=0;i<size_-1;i++)
{
*(Temp+i)=*(elements+i);
}
delete[] elements; //Error occurs here
elements=NULL;
elements=Temp;
*(elements+size_-1)=amaze;
}
}
运行调试器后,我发现程序到达delete []元素时有一个跟踪/断点陷阱。
为什么会发生此错误?
启用警告,您将看到不是在初始化elements
成员,而是在初始化变量:
T *elements=new T[size_];
因此,当删除它们时,基本上是在尝试删除从未分配过且指向无处的损坏指针。这有效地使程序崩溃。
顺便说一下,您应该发布正在运行的实际代码,因为当前您的类名是Vectors
,复数;但是构造函数称为Vector
。适当的构造函数将使用初始化列表,并且为explicit
:
explicit Vector(std::size_t size)
: size_(size), elements_(new T[size_])
{
}
默认构造函数不应尝试分配大小为0的数组。只需将elements
保留为nullptr
。
您的构造函数没有为elements
类成员分配任何内容。它们分配给同名的局部变量,从而遮蔽了类成员。因此,当push_back()
尝试对它进行初始化时,该类成员仍未初始化。
更改
delete[]
收件人
T *elements=new T[size_];
也请注意,您的类没有遵循elements=new T[size_];
,因为它缺少析构函数,复制构造函数和复制赋值运算符。并且它两次声明了Rule of 3/5/0成员,这应该无法编译。
尝试一下:
size_