我在数组头中有这个reSize函数
void reSize(int newsize) {
T* old = items;
size = newsize;
items = new T[newsize];
for (int i = 0;i < length;i++)
items[i] = old[i];
delete[]old;
}
和我的主代码:
struct User{
string name;
Array<int> data;
};
int main() {
Array<User> x(3);
x.get(0).name = "Kmal";
x.get(0).data.push_back(2); x.get(0).data.push_back(3);
x.reSize(10);
cout << x.get(0).data.get(0) <<endl;
return 0;
}
问题是在调整大小后,我存储在“数据”变量中的值消失了。
当我注解代码的时候。
第一个月
在reSize函数中,它工作得很好...所以我猜问题是,当我删除指针时,它也会删除结构体对象内部的指针,这是我不希望发生的..我不想注解该命令,因为会发生内存泄漏...如何解决这个问题?.更新:我的数组类。
#include <iostream>
using namespace std;
template <class T>
class Array {
private :
T* items;
int size;
int length;
public :
Array() {
this->size = 0;
items = new T[this->size];
length = 0;
}
Array(int size) {
this->size = size;
items = new T[this->size];
length = 0;
}
int getsize() {
return this->size;
}
template <class T> void push_back(T x) {
if ((length+1) <= size) {
items[length] = x;
length++;
}
else {
this->reSize(size+1);
items[length] = x;
length++;
}
}
template <class T> void Insert(int index, T x) {
if (length + 1 <= size) {
for (int i = length;i > index;i--) {
items[i] = items[i - 1];
}
items[index] = x;
length++;
}
else {
this->reSize(size+1);
for (int i = length;i > index;i--) {
items[i] = items[i - 1];
}
items[length] = x;
length++;
}
}
template <class T> int Find(T x) {
int index = -1;
for (int i = 0;i < length;i++) {
if (items[i] ==x) {
index = i;
break;
}
}
return index;
}
void remove(int index) {
items[index] = "";
if(index+1 < length)
for (int i = index;i < length-1;i++) {
items[i] = items[i + 1];
items[i + 1] = "";
}
length--;
}
void reSize(int newsize) {
T* old = items;
size = newsize;
items = new T[newsize];
for (int i = 0;i < length;i++)
items[i] = old[i];
delete[]old;
}
void Merge(Array<T> x){
T* old = items; int oldlength = length;
items = new T[size + x.size];
size = size + x.size;
length += x.length;
for (int i = 0;i < length;i++) {
if(i< oldlength)
items[i] = old[i];
else
items[i] = x.items[i-oldlength];
}
delete[] old;
}
T& get(int index) {
return items[index];
}
}
1条答案
按热度按时间vc9ivgsu1#
在代码中,声明
Array<User> x(3)
会声明一个包含3个预分配元素的 empty 数组。该数组的length
属性为0。复制该数组时,length
(0)个元素被复制到调整大小的存储区中。当您访问第0个元素时,它不会在resize时被复制,你实际需要做的是调用push_back()
,给数组添加一个元素,这样length就变成了1,并且这个元素在resize时被复制。另外,你的数组类缺少一个合适的复制构造函数和移动构造函数,这意味着复制它根本不起作用。这意味着
User
不能被正确复制,因为它包含一个数组,这意味着调整User
数组的大小将不起作用。你需要实现一个复制构造函数和复制赋值运算符来复制数组。你还需要一个析构函数,因为,现在,当数组超出作用域时,它会泄漏内存。