gpt4 book ai didi

c++ - 为什么在 C++ 中使用 Delete[] 会出现 Trace/Breakpoint 错误?

转载 作者:行者123 更新时间:2023-11-27 22:32:59 25 4
gpt4 key购买 nike

我目前正在制作一个“vector ”类。

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 Vector(std::size_t size)
: size_(size), elements_(new T[size_])
{
}

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

关于c++ - 为什么在 C++ 中使用 Delete[] 会出现 Trace/Breakpoint 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58583984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com