【问题标题】:Having run time error with "delete[]" [closed]“删除 []”出现运行时错误 [关闭]
【发布时间】:2014-05-03 18:06:46
【问题描述】:

我试图在 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];
}

};

当我在此列表类上使用类变量时出现了问题。 当我清除以删除一些内存时,出现运行时错误。

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

delete[](value);

我不明白,为什么?

【问题讨论】:

  • 可能是多次删除?顺便说一句,还有什么特别的错误? (哇,我的每日(否决)投票限制已达到 ;-( ...)
  • 你是如何使用那个代码的?
  • 重现问题的 T 类型是什么?
  • 您的delete[] 中的哪个 电话?
  • 某些类型(std::string 通常是一种)不一定能很好地处理 memcpy 并破坏原始对象。你测试的是什么类型的?

标签: c++ arrays memory delete-operator


【解决方案1】:

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

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

您还存在内存泄漏,因为您没有析构函数,因此当实例超出范围时,您将永远失去分配的内存。

您还应该阅读the rule of three

【讨论】:

  • 你说得对。我的 T 是一个包含指针的结构。有没有办法通过这个?以及关于泄漏。这就是我写行 delete[](value); 的方式。在添加功能上。
猜你喜欢
  • 2022-01-18
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
相关资源
最近更新 更多