gpt4 book ai didi

c++ - 分配大小无效(在派生类复制构造函数中)

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:13 24 4
gpt4 key购买 nike

我已将我的问题缩小到派生类复制构造函数,但我不确定原因。编辑: M、N 和数据是私有(private)的。我收到的错误是“无效的分配大小:4294967295 字节”——据我所知,这是在将 -1 传递给 new 时引起的。我不确定为什么会发生这种情况,除非类通信时数据丢失。

BinaryMatrix::BinaryMatrix(const BinaryMatrix& copy) : Matrix(copy)
{
//cout << "Copy Constructor\n";

M = copy.M;
N = copy.N;

data = new double[M*N]; //This line causes the allocation error

for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
data[i*N+j] = copy.data[i*N+j];
}
}
}

以上是导致错误的派生复制构造函数。我已经标记了分配线。

我只能假设 M 和 N 没有被正确读取。虽然我不确定为什么。我将包括派生构造函数和基础构造函数,以及基础拷贝。

感谢您的帮助。

矩阵(基础)构造函数

Matrix::Matrix(int M, int N, double* input_data)
{
this->M = M;
this->N = N;

//cout << "Matrix Constructor\n";
data = new double[M*N];

for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
data[i*N+j] = input_data[i*N+j];
}
}

delete [] input_data;
}

矩阵(基础)复制构造函数

Matrix::Matrix(const Matrix& copy)
{
//cout << "Copy Constructor\n";

M = copy.M;
N = copy.N;

data = new double[M*N];

for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
data[i*N+j] = copy.data[i*N+j];
}
}
}

二元矩阵(派生)构造函数

BinaryMatrix::BinaryMatrix(int M, int N, double* input_data) : Matrix(M, N, input_data)
{
data = new double[M*N];

for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
this->data[i*N+j] = this->getRead(i, j);
}
}

double thr_val = this->Mean();

for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
if (this->data[i*N+j] > thr_val)
this->data[i*N+j] = 1;

if (this->data[i*N+j] < thr_val)
this->data[i*N+j] = 0;
}
}
}

最佳答案

为什么要在 BinaryMatrix 复制构造函数中创建矩阵数据的新拷贝?您从 BinaryMatrix 复制构造函数调用的 Matrix 复制构造函数已经执行此操作。

BinaryMatrix 复制构造函数中,您丢弃了 Matrix 复制构造函数已经创建的矩阵数据拷贝(没有 delete 它)并且创建一个新的。这是内存泄漏 - 如果您经常这样做,内存将会耗尽。

关于c++ - 分配大小无效(在派生类复制构造函数中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9751119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com