复制构造函数生成旧数组的错误副本
Copy constructor producing incorrect copy of old array
我有一个类vector210
,我正在尝试创建一个复制构造函数,如下面的示例代码中所述(仅完整代码的一部分(。
class vector210 {
public:
int arraySize;
int values[1];
vector210(int array[], int arraySize_){
arraySize = arraySize_;
for(int i = 0;i !=arraySize_;i++){
values[i] = array[i];
}
}
vector210(const vector210 &p){
int values [p.arraySize];
for(int i=0;i<p.arraySize;i++){
values[i] = p.values[i];
};
arraySize = p.arraySize;
};
void print(){
for(int i =0;i <arraySize;i++){
cout << values[i] << endl;
}
if (arraySize ==0){
cout << "Vector is empty." << endl;
}
};
当我在main
中运行代码时,如下所示:
#include "CST210vector.h"
#include <iostream>
using namespace std;
int main() {
int v[5] = {1,2,3,4,5} ;
vector210 test(v, sizeof(v)/sizeof(*v));
cout << "Array to copy " << endl;
test.print();
cout << "Copied array values:"<< endl;
vector210 testnew = test;
testnew.print();
cout << " " << endl;
cout << testnew.size() << endl;
}
我收到终端的输出:
Array to copy
1
2
3
4
5
Copied array values:
5
4198189
0
1
2
因此,不知何故,调用复制构造函数时构造的数组似乎与旧版本的vector210
对象中的数组大不相同,但我不确定这是如何发生的。有没有人知道这个错误是如何发生的?相反,我希望我的复制构造函数生成原始数组的精确副本。
你的方法是错误的vector210::values
应该是一个指针,你应该为它分配内存。C++没有动态数组。你的类和构造函数应该看起来像这样
class vector210 {
public:
int arraySize;
int* values; // pointer!
vector210(const int* array, int arraySize_) :
arraySize(arraySize_),
values(new int[arraySize_]) { // allocate memory
for (int i = 0; i != arraySize_; i++)
values[i] = array[i];
}
...
}
现在你的复制构造函数应该是类似的,它使用 new 分配内存。
您正在使用 dinamic 数组。编译器应该抱怨它
我建议使用指针作为 int a [] 变为 int * a,以下内容对我来说很好用
class vector210 {
public:
int arraySize;
int *values;
vector210(const vector210 &p){
values = new int[p.arraySize];
memcpy ( values , p.values, p.arraySize*sizeof(int) );
p.values[1] = 0;
arraySize = p.arraySize;
}
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- std::任何只用于移动的模板,其中副本ctor内的static_assert等于编译错误,但为什么
- 复制构造函数生成旧数组的错误副本
- 在派生类CTOR中接收基类副本是错误的吗?
- 显示 VC++ 中的错误的 Visual C++ 数组副本
- 错误,无法在构造体主体中构造lambda的副本
- 在已删除的副本分配中检测到虚假错误
- 错误的数组初始化与赋值副本构造函数初始化