我模拟了一个向量,但是构造函数不起作用;当我调用pop()
函数时,它会将垃圾值分配给矢量类中的旧对象。
vector(vector &v) {
vec = new T[v.size()];
memcpy(vec, v,v.size());
size_arr = v.size();
}
这里是完整代码:
#include <iostream>
using namespace std;
template <typename T>
class vector {
int size_arr;
T * vec = new T;
public:
vector(/*int _size*/) {
vec = new T[0];
size_arr = 0;
};
~vector() {
size_arr = 0;
delete[] vec;
};
vector(vector &v) {
vec = new T[v.size()];
memcpy(vec, v,v.size());
size_arr = v.size();
}
void push_back(T data) {
T *temp = new T[size_arr + 1];
for (int i = 0; i < size_arr; i++)
temp[i] = vec[i];
temp[size_arr] = data;
size_arr++;
delete[] vec;
vec = temp;
};
void push_front(T data){
int j;
T *temp = new T[size_arr + 1];
for ( j = size_arr; j >= 0;j--) {
temp[j + 1] = vec[j];
}
temp[0] = data;
delete[] vec;
vec = temp;
size_arr++;
};
void insert(int index, T data) {
int j;
T *temp = new T[size_arr + 1];
for (int i = 0; i < size_arr ;i++)
temp[i] = vec[i];
for (int i = 0; i < size_arr;i++) {
if (i == index) {
for ( j = size_arr; j >=i;j--) {
temp[j+1] = vec[j];
}
temp[j + 1] = data;
delete[] vec;
vec = temp;
size_arr++;
}
}
};
void pop() {
T *temp = new T[size_arr - 1];
for (int i = 0; i < size_arr-1;i++)
temp[i] = vec[i];
size_arr--;
delete[] vec;
vec = temp;
};
void Delete(int index)
{
T *temp = new T[size_arr - 1];
for (int i = 0; i < index;i++)
temp[i] = vec[i];
for (int i = 0; i < size_arr;i++) {
if (i == index) {
for (int j = i; j < size_arr-1;j++) {
temp[j] = vec[j + 1];
}
size_arr--;
delete[] vec;
vec = temp;
}
}
};
int search(T data) {
for (int i = 0; i < size_arr;i++) {
if (vec[i] == data) {
return i;
}
}
return -1;
};
int size() { return size_arr; };
};
int main() {
vector <int>test;
test.push_front(2);
test.push_front(3);
test.push_back(0);
test.push_back(-1);
test.insert(2, 2);
test.pop();
vector <int > test1;
test1 = test;// problem
test1.pop();
}
问题是test1 = test;// problem
行,它不调用复制构造函数,而是调用赋值运算符。您没有声明此运算符,因此编译器将使用默认实现,该实现只是复制所有成员。因此,分配后,test1.vec
和test.vec
指向相同的存储位置。
当您将行(及其上方的一行)更改为vector <int > test1{test};
时,它将调用您的副本构造函数。
您也忘记了#include <cstring>
的memcpy
,您不应该将其用于非POD类型。
您必须将memcpy
中的大小乘以sizeof(T)
,因为memcpy
适用于字节,而不适用于类型。您还必须使用v.vec
而不是v
。
这里是固定版本:https://ideone.com/JMn7ww
我认为问题出在您的复制运算符中。您使用memcpy()
这是一个c函数。它本身不应该是一个问题(除了在很多观点上不是那么好)。但是由于memcpy()是c函数,所以它不了解类型,并且将其大小参数作为字节数。
您放入的元素是int
,可能是4个字节。因此,当您的复制构造函数被调用且原始结构具有3个元素时,数组中将有12个字节,但是malloc将仅复制其中3个字节。
其他人关于不正确复制模板类型的评论是正确的,因此,如果您创建字符串向量,则不能仅将其存入内存,并假定结果将是新字符串。对于这个答案,我假设您仅使用基本类型作为模板参数,例如int或double。