为什么在c++中使用Delete[]会出现跟踪/断点错误
Why is there a Trace/Breakpoint error using Delete[] in c++?
我目前正在制作一个"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
,复数;但是构造函数被称为CCD_ 3。一个合适的构造函数将使用初始化器列表,并且将是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_];
还要注意,您的类不遵循3/5/0规则,因为它缺少析构函数、复制构造函数和复制赋值运算符。并且它声明了两次size_
成员,应该无法编译。
试试这个:
template <typename T>
class Vector{
private:
int size_;
int count_;
T *elements;
public:
Vector(){
size_ = 0;
count_ = 0;
elements = new T[size_];
}
Vector(int size){
size_ = size;
count_ = 0;
elements = new T[size_];
}
Vector(const Vector &v){
size_ = v.size_;
count = v.count_;
elements = new T[size_];
for(int i = 0; i < count_; ++i) {
elements[i] = v.elements[i];
}
}
~Vector() {
delete[] elements;
}
void push_back(T amaze){
if (count_ == size_) {
T *Temp = new T[size_ * 2];
for(int i = 0; i < count_; ++i) {
Temp[i] = elements[i];
}
delete[] elements;
elements = Temp;
size_ *= 2;
}
elements[count_]= amaze;
++count_;
}
void swap(Vector &other) {
std::swap(elements, other.elements);
std::swap(size_, other.size_);
std::swap(count_, other.count_);
}
Vector& operator=(const Vector &v) {
if (&v != this) {
Vector(v).swap(*this);
}
return *this;
}
};
相关文章:
- 光线跟踪器灯光反射错误
- 为什么在c++中使用Delete[]会出现跟踪/断点错误
- 使用valgrind跟踪段错误,并了解valgrind输出
- 错误:未知类型名称"功能跟踪"
- C 错误跟踪意外令牌
- 需要帮助跟踪此代码中的分段错误
- 跟踪器示例中的OpenCV 3.0链接器错误
- 添加 -lrt 时跟踪编译器错误"undefined reference"不起作用
- 我无法跟踪函数的错误
- 人脸跟踪错误 Opencv
- C++错误:调用"跟踪::跟踪(字符,字符)"没有匹配函数
- opencv 卡尔曼滤波多对象跟踪错误
- cpp 链接器失败,无法跟踪错误源
- 如何从这些信息中跟踪错误代码
- 如何跟踪LLVM验证功能错误"Expected no forward declarations!"?
- 无法使用sqlite3数据库表的所有行中的数据填充列表,错误:跟踪/断点陷阱(核心转储)
- 如何解决堆栈跟踪错误
- mystackwalker.cxx(29):错误 C3861:"捕获堆栈回跟踪":找不到标识符
- Valgrind内存泄漏错误的文件跟踪
- c++中如何在do while循环中使用计数器跟踪错误