运行时错误与"delete[]"

Having run time error with "delete[]"

本文关键字:delete 运行时错误      更新时间:2023-10-16

我试图用c++编写我自己的List类。

代码如下:

template <class T>
class List
{
private:
    T *value, *valueHelper;
    int valueSize;
public:
    int size;
List()
{
    valueSize = 2;
    value = new T[valueSize];
    size = 0;
}

void Add(T val)
{
    size++;
    if (size > valueSize)
    {
        valueSize *= 2;
        valueHelper = new T[valueSize]; 
        memcpy(valueHelper, value, sizeof(T) * (size - 1));
        delete[](value);
        value = valueHelper;
    }
    value[size - 1] = val;
}

void Clear()
{
    delete[](value);
    size = 0;
    valueSize = 2;
    value = new T[valueSize];
}

T & operator[](int P)
{
    return value[P];
}
};

当我在这个List类上使用一个类变量时,问题出现了。当我执行Clear来删除一些内存时,会出现一个运行时错误。

我试图检查导致这个问题的原因,我发现函数Clear()上的这一行是错误行:

delete[](value);

我不明白,为什么?

我在这里只是猜测,但它可能是因为您将有List实例的副本,例如通过从函数返回它或将其作为非引用参数传递给函数。

对象的复制是由编译器生成的默认复制构造函数实现的,但它只进行复制,这意味着它将复制指针,但不复制它们指向的内容。因此,你将有两个指针指向同一内存的副本,当一个对象删除该内存时,另一个指针将无效。

你也有内存泄漏,因为你没有析构函数,所以当实例超出作用域时,你将永远失去分配的内存。