在C++中动态调整数组大小无法正常工作

oxiaedzo  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(131)

我在数组头中有这个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];
    }
   }
vc9ivgsu

vc9ivgsu1#

struct User{
string name;
 Array<int> data;
};
int main() {
Array<User> x(3);

// this line causes some problems
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;
}

在代码中,声明Array<User> x(3)会声明一个包含3个预分配元素的 empty 数组。该数组的length属性为0。复制该数组时,length(0)个元素被复制到调整大小的存储区中。当您访问第0个元素时,它不会在resize时被复制,你实际需要做的是调用push_back(),给数组添加一个元素,这样length就变成了1,并且这个元素在resize时被复制。
另外,你的数组类缺少一个合适的复制构造函数和移动构造函数,这意味着复制它根本不起作用。这意味着User不能被正确复制,因为它包含一个数组,这意味着调整User数组的大小将不起作用。你需要实现一个复制构造函数和复制赋值运算符来复制数组。你还需要一个析构函数,因为,现在,当数组超出作用域时,它会泄漏内存。

相关问题