我试图在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);
我无法理解,为什么?
答案 0 :(得分:1)
我只是在这里猜测,但可能是因为您将拥有List
实例的副本,例如通过从函数返回它或将其作为非引用参数传递给一个功能。
对象的复制是由编译器生成的默认复制构造函数实现的,但它只进行浅复制,这意味着它将复制指针但不复制它们指向的对象。那么你将有两个副本,指针指向同一个内存,当一个对象删除该内存时,其他指针将无效。
你也有一个内存泄漏,因为你没有析构函数,所以当一个实例超出范围时你会永远丢失分配的内存。
您还应该阅读the rule of three。