C ++析构函数抛出错误

时间:2018-01-24 05:34:30

标签: c++ destructor

我有以下代码:

class MyList
{
    private:

    public:
        int* list;
        int size = 0;
        int max;

        // constructor
        MyList(int s)
        {
            max = s;
            size = 0;
            if(max > 0)
                list = new int[max];
        };

        // destructor
        ~MyList()
        {
            for (int x = 0; x < max; x++)
                delete (list + x);
        };
};

我试图用析构函数清除内存。但是,它会在第二次迭代时抛出错误。我做错了什么?此外,它不会让我这样做:

delete list[x];

有人可以向我解释原因吗?非常感谢你。

3 个答案:

答案 0 :(得分:6)

您应该使用delete[],因为list是通过new[] - 表达式创建的。 e.g。

// destructor
~MyList()
{
    delete[] list;
}

请注意,它们必须成对; new int[max]创建一个包含max个元素的数组,delete[]销毁整个数组。 delete只应用于由new创建的指针。

最好将构造函数更改为

// constructor
MyList(int s)
{
    max = s;
    size = 0;
    if(max > 0)
        list = new int[max];
    else
        list = nullptr;
}

确保list始终有效。

答案 1 :(得分:2)

试试这个:

MyList(int s)
: max(s),
  size(0),
  list(new int[s])
{
};

~MyList()
{
    delete[] list;
};

答案 2 :(得分:0)

我明白你为什么要用 释放内存的循环......你应该简单地写一下

删除[]列表;

这就足够了! 在你的析构函数中,你正在使用delete(list(一个指针)+ x)这不会释放你创建的内存... 您正在尝试通过在其中添加x循环的值来删除列表旁边的地址 我希望你理解你的错误:)