将阵列存储到动态内存中

时间:2019-01-07 11:42:12

标签: c++ c++11 visual-c++

我正在将数组传递给构造函数。构造函数具有两个参数,即指向数据的int指针和作为数组大小的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 :(得分:2)

Test::Test构造函数中,您无需复制数组,而只需复制指针。您需要使用std::copymemcpy(C风格)将d的内容复制到data中。

但是,我建议使用STL容器(即std::vector)而不是原始指针。它将使您摆脱易于出错和冗余的手动资源管理(新/删除)的工作。

答案 1 :(得分:1)

您需要在此处复制数据。代替:

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

哪个会创建一个数组,然后忘记它。这将导致阵列被多次删除!

复制数组的内容:

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

或更妙的是,使用std::vector