删除动态分配的数组时出错
error deleting a dynamically allocated array
这门课是期中作业。它是一个动态数组,工作原理类似于矢量。问题是,当一个新索引被添加到数组中时,析构函数被调用(当程序结束时),程序会抛出异常并进入一个名为 dgbheap.c 的文件。当我仅在析构函数中删除原点时,就会发生这种情况。
DynamicArray.h
#ifndef DYNAMICARRAY_H
#define DYNAMICARRAY_H
#include <new>
#include <cstdlib>
using namespace std;
template <class T>
class DynamicArray
{
private:
T *origin;
T *allocator;
int size;
int current;
public:
DynamicArray();
DynamicArray(int);
DynamicArray(const DynamicArray&);
~DynamicArray();
void add(int);
void empty();
void remove(int);
int getSize();
T &operator[](const int&);
const T operator=(const DynamicArray&);
void put(T&);
void put(T);
};
template <class T>
DynamicArray<T>::DynamicArray()
{
origin = new T[5];
allocator = NULL;
size = 5;
current = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(int s)
{
size = s;
try
{
origin = new T[s];
allocator = NULL;
current = 0;
}
catch(bad_alloc)
{
cout << "Error: Bad memery allocationn";
exit(EXIT_FAILURE);
}
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray& obj)
{
empty();
for(int counter = 0; counter < obj.size - 1; counter++)
{
origin[counter] = obj.origin[counter];
}
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
delete [] origin;
delete [] allocator;
}
template <class T>
void DynamicArray<T>::add(int size)
{
allocator = new T[size];
for(int counter = 0; counter < this-> size - 1; counter++)
{
allocator[counter] = origin[counter];
}
delete [] origin;
origin = new T[size];
this->size = this->size + size;
for(int counter = 0; counter < this->size - 1; counter++)
{
origin[counter] = allocator[counter];
}
allocator = NULL;
}
template <class T>
void DynamicArray<T>::empty()
{
if(size >= 0)
delete [] origin;
}
template <class T>
int DynamicArray<T>::getSize()
{
return size;
}
template <class T>
T &DynamicArray<T>::operator[](const int &index)
{
return origin[index];
}
template <class T>
const T DynamicArray<T>::operator=(const DynamicArray &obj)
{
size = obj.size;
delete [] origin;
origin = new T[size];
for(int counter = 0; counter < size; counter++)
*(origin + counter) = *(obj.origin + counter);
return *origin;
}
template <class T>
void DynamicArray<T>::put(T &obj)
{
if(current == size - 1)
{
add(1);
origin[size - 1] = obj;
++current;
}
else
{
origin[current] = obj;
++current;
}
}
template <class T>
void DynamicArray<T>::put(T obj)
{
if(current > size - 1)
{
add(1);
origin[size - 1] = obj;
++current;
}
else
{
origin[current] = obj;
++current;
}
}
template <class T>
void DynamicArray<T>::remove(int location)
{
allocator = new T[size - 1];
int skipper = 0;
for(int counter = 0; counter < size - 1; counter++, skipper++)
{
if(counter != location)
allocator[counter] = origin[skipper]
else if(counter == location)
{
++skipper;
allocator[counter] = origin[skipper]
continue;
}
}
}
#endif // !DYNAMICARRAY_H
主.cpp
#include <iostream>
#include <string>
#include "DynamicArray.h"
using namespace std;
int main()
{
DynamicArray<int> a(5);
a.put(21);
a.put(22);
a.put(30);
a.put(58);
a.put(87);
a.put(87);
cout << a[0] << endl;
cout << a[1] << endl;
cout << a[2] << endl;
cout << a.getSize() << endl;
system("pause");
return 0;
}
问题出在:
模板 void 动态数组::添加(int size);
您混淆了具有相同名称的大小变量 this-size> 和参数大小
下面是更正的成员函数:
template <class T>
void DynamicArray<T>::add(int size)
{
allocator = new T[this->size]; // was just 'size', needs to be old size
for(int counter = 0; counter < this->size - 1; counter++)
{
allocator[counter] = origin[counter];
}
delete [] origin;
this->size = this->size + size; // was down one line
origin = new T[this->size]; // was 'size'. ie old size, not new size set in line above
for(int counter = 0; counter < this->size - 1; counter++)
{
origin[counter] = allocator[counter];
}
allocator = NULL;
}
您的复制构造函数未初始化origin
。 它应该是这样的:
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray& obj)
: origin(new T[obj.size]),
size(obj.size),
allocator(NULL),
current(obj.current)
{
for(int counter = 0; counter < obj.size; counter++)
{
origin[counter] = obj.origin[counter];
}
}
还要小心您的empty()
方法:
template <class T>
void DynamicArray<T>::empty()
{
delete [] origin;
origin = NULL;
size = 0;
}
相关文章:
- 使用 thread 类在 C++ 中构造线程的动态数组时出错
- 将链表转换为指针数组时出错
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 基于数组的列表 - 动态数组创建时出错
- 从斐波那契序列 c++ 中的数组中查找正确的元素时出错
- 分段 使用 MPI_Gather 收集字符数组时出错
- 读取字符串字符时出错 - 对于数组中的字符串值
- 声明数组>> int arr[] 时出错;在C++(虽然在 Java 中有效)?
- 在 c++ 中返回一维数组时出错
- 将 2D 数组传递给 C++ 中的函数时出错
- 在 c++ 上创建动态数组时出错
- 尝试返回指向 Visual Studio 中的动态数组的指针时出错C++
- 将 find_if() 与数组一起使用的代码段中出错
- 在比较特定输入中的程序的数组中出错
- 分段 填充数组时出错
- 数组作为函数参数查找数组长度时出错
- 读取结构数组时出错
- 将数组指针传递到函数时出错
- C++将指针数组传递给函数指针数组时出错
- 在数组中插入数据时出错 - 数组下标'int[int]'的类型无效