我正在将数组传递给构造函数。构造函数具有两个参数,即指向数据的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;
}
答案 0 :(得分:2)
在Test::Test
构造函数中,您无需复制数组,而只需复制指针。您需要使用std::copy
或memcpy
(C风格)将d
的内容复制到data
中。
但是,我建议使用STL容器(即std::vector
)而不是原始指针。它将使您摆脱易于出错和冗余的手动资源管理(新/删除)的工作。
答案 1 :(得分:1)
您需要在此处复制数据。代替:
data = new int[s];
data = d;
哪个会创建一个数组,然后忘记它。这将导致阵列被多次删除!
复制数组的内容:
std::copy(d, d+s, data);
或更妙的是,使用std::vector
。