Когда я собираюсь удалить динамический массив, я получаю двойную ошибку или повреждение - PullRequest
0 голосов
/ 12 июня 2019

Я новичок в C ++. Я попробую запустить небольшое приложение динамического массива. Итак, я создал два динамических массива, затем я удалил два массива с помощью команды delete [], но я получаю ошибку double free или повреждение

class DynamicArray
{
    private:
        X *array;
        int Size;
        int Reserve_size;

    public:
        DynamicArray()
        {
            array = new X[_DEFAULT_SIZE];
            Size = 0;
            Reserve_size = _DEFAULT_SIZE;
        }
        ~DynamicArray()
        {
            delete[] array;
        }

        void insert(X data)
        {
            if (Size == Reserve_size)
            {
                X *tempArray = new X[Reserve_size + _DEFAULT_SIZE];

                for (size_t i = 0; i < Size; i++)
                {
                    tempArray[i] = array[i];
                }
                //memcpy(newArray, array, sizeof(array));
                delete[] array;
                array = tempArray;
                delete[] tempArray;
                Reserve_size = Reserve_size + _DEFAULT_SIZE;
            }

            array[Size] = data;

            Size++;

        }

        X Get(int index)
        {
            return array[index];
        }
};

1 Ответ

1 голос
/ 12 июня 2019

Вы удаляете массив, на который указывает array, дважды: один раз в insert и снова в ~DynamicArray.

Помните, что для каждого вызова new должен быть ровно один, и толькоодин, позвоните на delete.Также помните, что вы не delete указатели, вы delete объекты, на которые указывают указатели .

Вот набор графиков, который, надеюсь, прояснит, что происходит:

После конструктора:

  array
+-------+        +--+--+--+-----+--+
|       +-------->  |  |  | ... |  |
+-------+        +--+--+--+-----+--+

После X *tempArray = new X[Reserve_size + _DEFAULT_SIZE]:

  array
+-------+        +--+--+--+-----+--+
|       +-------->  |  |  | ... |  |
+-------+        +--+--+--+-----+--+

tmpArray
+-------+        +--+--+--+-----+--+-----+--+--+
|       +-------->  |  |  | ... |  | ... |  |  |
+-------+        +--+--+--+-----+--+-----+--+--+

После delete[] array:

  array
+-------+
|       +-------->
+-------+

tmpArray
+-------+        +--+--+--+-----+--+-----+--+--+
|       +-------->  |  |  | ... |  | ... |  |  |
+-------+        +--+--+--+-----+--+-----+--+--+

После array = tempArray:

  array
+-------+
|       +---------+
+-------+         |
                  |
tmpArray          |
+-------+        +v-+--+--+-----+--+-----+--+--+
|       +-------->  |  |  | ... |  | ... |  |  |
+-------+        +--+--+--+-----+--+-----+--+--+

После delete[] tempArray:

  array
+-------+
|       +---------+
+-------+         |
                  |
tmpArray          |
+-------+         v
|       +-------->
+-------+

В ~DynamicArray:

  array
+-------+
|       +---------+
+-------+         |
                  |
                  |
                  v

Ой, array ни на что не указывает, так что вы можете 't delete[] на что он указывает.

...