我试图与圆形的数组一起工作,因此最终编写了我已将代码附加的圆形隔间类。它使用数组的通用指针。当我尝试使用std :: vector创建这样的圆形阵列列表时,当我尝试在其上使用擦除时,我会面临问题。
我不明白为什么会这样,因为我认为破坏者和复制构造函数正常工作得很好。
有人可以帮忙吗?
代码:
循环级课
template<class T> class CircularArray
{
//Class denoted by 'T' is expected to have a functional assignment operator, i.e. operator=(const T& ext) {} in place
protected:
int size=0;
int ori=0;
T* array;
private:
int pos=0;
public:
CircularArray() : CircularArray(0) {}
CircularArray(int s) {size=s;array=new T[s];}
CircularArray(T* ptr,int s)// : CircularArray(s)
{
size=s;array=new T[s];
for(int i=0;i<size;i++)
array[i]=ptr[i];
}
CircularArray(const CircularArray<T>& arr) : CircularArray(arr.size)
{
for(int i=0;i<size;i++)
array[i]=arr.array[i];
}
~CircularArray() {delete[] array;}
...
测试代码
int main()
{
std::vector<CircularArray<int>> test;
int *a1=new int[3] {1,2,3},*a2=new int[3] {1,2,3},*a3=new int[3] {1,2,3};
CircularArray<int> n1(a1,3),n2(a2,3),n3(a3,3);
test.push_back(n1);
test.push_back(n2);
test.push_back(n3);
test.erase(test.begin()+1);
for(auto v : test)
{
for(int i=0;i<3;i++)
cout << v[i];
cout << "n";
}
}
此程序在遇到向量的已删除部分后提供了不良的输出。Valgrind说,试图读取自由记忆的记忆损坏。怎么了?
向量元素必须是可复制/移动分配的,但是您依靠不会创建任何新的内存的默认复制分配运算符。您分配的对象都共享相同的内存空间,后来又有双免费。
您的构造函数很好,但是您也需要一个副本/移动分配操作员。
阅读有关五个规则的
还考虑仅使用std::vector
进行备份存储;这会更简单。
删除[]是否可以与通用数组正常使用?
是。
您(隐式生成的(副本和移动分配运算符是错误的。他们将复制会员指针。然后,您有两个指向同一数组的指针,一个驱动器一次将其删除,另一个将其删除了第二次,这导致了不确定的行为。
手动管理动态资源时,必须跟踪所有权,并确保它精确发布一次。典型的解决方案是使用智能指针。您的班级拥有独特的所有权(或者,如果没有意外地在分配运营商中共享所有权(的独特所有权,那么一个独特的指针将是一个适当的选择。
另一方面,您可以使用矢量容器而不是智能指针。