为什么在c ++中使用Delete []会出现跟踪/断点错误?

问题描述 投票:0回答:2

我目前正在制作“向量”类。

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 []元素时有一个跟踪/断点陷阱。

为什么会发生此错误?

c++ class typename
2个回答
1
投票

启用警告,您将看到不是在初始化elements成员,而是在初始化变量:

T *elements=new T[size_];

因此,当删除它们时,基本上是在尝试删除从未分配过且指向无处的损坏指针。这有效地使程序崩溃。

顺便说一下,您应该发布正在运行的实际代码,因为当前您的类名是Vectors,复数;但是构造函数称为Vector。适当的构造函数将使用初始化列表,并且为explicit

explicit Vector(std::size_t size)
: size_(size), elements_(new T[size_])
{
}

默认构造函数不应尝试分配大小为0的数组。只需将elements保留为nullptr


1
投票

您的构造函数没有为elements类成员分配任何内容。它们分配给同名的局部变量,从而遮蔽了类成员。因此,当push_back()尝试对它进行初始化时,该类成员仍未初始化。

更改

delete[]

收件人

T *elements=new T[size_];

也请注意,您的类没有遵循elements=new T[size_]; ,因为它缺少析构函数,复制构造函数和复制赋值运算符。并且它两次声明了Rule of 3/5/0成员,这应该无法编译。

尝试一下:

size_
© www.soinside.com 2019 - 2024. All rights reserved.