删除[]是否可以与通用数组正常使用?如果是这样,为什么使用std :: vector ::擦除它会导致释放内存的错误

Does delete[] work properly with generic arrays? If so why does using std::vector::erase on it cause error in freeing memory

本文关键字:擦除 vector std 为什么 错误 内存 释放 是否 数组 删除 如果      更新时间:2023-10-16

我试图与圆形的数组一起工作,因此最终编写了我已将代码附加的圆形隔间类。它使用数组的通用指针。当我尝试使用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进行备份存储;这会更简单。

删除[]是否可以与通用数组正常使用?

是。

您(隐式生成的(副本和移动分配运算符是错误的。他们将复制会员指针。然后,您有两个指向同一数组的指针,一个驱动器一次将其删除,另一个将其删除了第二次,这导致了不确定的行为。

手动管理动态资源时,必须跟踪所有权,并确保它精确发布一次。典型的解决方案是使用智能指针。您的班级拥有独特的所有权(或者,如果没有意外地在分配运营商中共享所有权(的独特所有权,那么一个独特的指针将是一个适当的选择。

另一方面,您可以使用矢量容器而不是智能指针。