使用Memcpy扩展指针数组的大小

Using Memcpy to widen the size of an array of pointers

本文关键字:数组 指针 Memcpy 扩展 使用      更新时间:2023-10-16

正如标题所示,我想重新创建一个数组,它将有一个不同的大小比原来的一个。

我的原始数组是在类初始化时创建的,它位于类的私有成员中。该数组称为Node* arr[10]。它最初设置为10的大小,一旦应用程序需要更多的空间长度,我希望使用memcpy创建一个新数组,这将与原始arr相同,但唯一的区别是它的最大大小。

下面是我写的代码,但是我遇到了一个错误。

//Part Of Class
private:                
Node* arr[10];

//Part Of Method
size_t newSize = size * 2;
            Node** newArr = new Node*[newSize];
            memcpy(newArr, arr, size * sizeof(Node*));
            maxSize = newSize;
            delete[] arr;
            arr = newArr;

错误显示在最后一行,arr = newArr,它指出它不能从Node**转换到Node*[10]。这到底是为什么呢?是因为Arr是在类开始的时候开始的吗?

悬停在newArr上显示Node**,悬停在arr上显示Node* Map::arr[10]。有人可以解释我的选择与此,因为我想坚持与数组,我不想改变到向量。我理解的问题是,他们没有被归类为同一类型,但是,如果我删除第二个星号上的newArr =新节点*,它说它也不能转换。

感谢您阅读我的问题,我希望问题的格式是正确的,Regards

Node* arr[10]

arr是指向Node的10个指针数组。

是一个自动成员变量。它被存储为"Class"实例的子对象。

delete[] arr;

不能在成员数组上调用delete[]。这具有未定义的行为。您只能在调用new[]返回的指针 (arr不是)上调用delete[]

初始设置为10

成员的类型是"array of 10 objects"。在程序执行期间,变量的类型永远不会改变。因此,成员的大小永远不会改变。如果大小为10 "original ",则始终为10。

Node** newArr

newArr是指向Node的指针的指针。这与数组有本质的区别。

= new Node*[newSize];

newArr初始化为指向动态分配的指针数组的第一个元素。

arr = newArr;

这是错误的。不能给数组赋值。


可以使用可以指向动态分配的数组的成员指针,而不是不能调整大小的成员数组。这个成员指针可以被赋值给另一个更大的数组(只是要记住不要泄漏前一个数组)。

然而,手动内存管理很容易出错,将我描述的成员指针包装在分配动态内存的容器中,并在销毁时释放它,将会很方便。在标准库中已经存在这样的容器:std::vector .
//Part Of Class
private:                
std::vector<Node*> arr = std::vector<Node*>(10);

//Part Of Method
arr.resize(arr.size() * 2);

您需要将arr的类型设置为Node**。比如

size_t maxSize = 10;
Node** arr = new Node*[maxSize];

在类声明中应该做。

现在需要一个析构函数(释放内存)、一个复制构造函数(创建数组的副本)和一个复制赋值操作符(或者可以删除最后两个)。如果效率很重要,你还需要一个move构造函数和一个move赋值操作符。

或者,与其在堆上创建初始arr,不如这样写:

static const initial_maxSize = 10;
size_t maxSize = initial_maxSize;
Node* initialArr[initial_maxSize];
Node** arr = &initialArr;  // Initialize arr to point at the array.

当你要删除arr时,你需要:

    if (arr != initialArr)
        delete [] arr;

…重要的是不要删除你没有从new得到的东西。

最后,真的请重新考虑使用向量。它使很多工作变得更简单,并且在您自己的实现上基本上没有开销(并且实际上可能更快/更紧凑)。