运行时错误“delete []”

时间:2014-05-03 18:06:46

标签: c++ arrays memory delete-operator

我试图在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 Class上使用类变量时出现问题。 当我清除删除某些内存时,会出现运行时错误。

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

delete[](value);

我无法理解,为什么?

1 个答案:

答案 0 :(得分:1)

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

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

你也有一个内存泄漏,因为你没有析构函数,所以当一个实例超出范围时你会永远丢失分配的内存。

您还应该阅读the rule of three