Сохранить массив в динамическую память - PullRequest
0 голосов
/ 07 января 2019

Я передаю массив конструктору. Конструктор имеет два параметра: указатель на int, называемый data, и int, который является размером массива.

Я выделяю динамическую память в определении конструктора для этого массива и передаю указатель массива на это хранилище.

Последний, но один шаг - печать значений в массиве через указатель, который указывает на первое значение int этого массива.

Последний шаг - освобождение памяти в данных деструктора delete []. На этом шаге я получил сообщение об ошибке: Отладочное утверждение не удалось! Выражение: _CrtlsValidHeapPpinter (block).

Я очень новичок в C ++, поэтому я борюсь за то, что я сделал неправильно в приведенной ниже программе. Не могли бы вы дать мне подсказку, пожалуйста?

#include <iostream>

class Test
{
private:
    int* data;
    int size;
public:
    // constructor and destructor
    Test(int* d, int s);
    ~Test();

    // few void methods
    void display_data(int size)
    {
        for (int i{ 0 }; i < size; ++i)
        {
            std::cout << data[i] << " ";
        }
        std::cout << std::endl;
    }
};

 Test::Test(int* d, int s)
    : data{nullptr}, size(s)
{
    data = new int[s];
    data = d;
}

Test::~Test()
{
    std::cout << "Destructor is freeing memory" << std::endl;
    delete[] data;
}


int main()
{
    int data_array[5]{ 2,8,6,10,20 };
    Test* t1 = new Test(data_array, 5);

    t1->display_data(5);

    delete t1;

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Вам необходимо скопировать данные здесь. Вместо:

data = new int[s];
data = d;

Который создает массив, а затем забывает об этом. Это приведет к многократному удалению массива!

Скопируйте содержимое вашего массива:

std::copy(d, d+s, data);

Или даже лучше, используйте std::vector.

0 голосов
/ 07 января 2019

В конструкторе yout Test::Test вы не копируете массив, вы просто копируете указатель. Вам необходимо использовать std::copy или memcpy (стиль C), чтобы скопировать содержимое d в data.

Однако я бы рекомендовал использовать контейнеры STL (т. Е. std::vector) вместо необработанных указателей. Это позволит вам избавиться от ручного управления ресурсами (new / delete), которое подвержено ошибкам и избыточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...