使用Memcpy扩展指针数组的大小
Using Memcpy to widen the size of an array of pointers
正如标题所示,我想重新创建一个数组,它将有一个不同的大小比原来的一个。
我的原始数组是在类初始化时创建的,它位于类的私有成员中。该数组称为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
得到的东西。
最后,真的请重新考虑使用向量。它使很多工作变得更简单,并且在您自己的实现上基本上没有开销(并且实际上可能更快/更紧凑)。
- 添加到数组指针
- C++语法差异:二维和一维数组(指针算术)
- 数组指针表示法C++(移动数组时)
- 复制后删除原始数组指针将前 3 个字节设置为 0
- C++访问指向结构的指针中的类数组指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 创建<int>对整数数组指针的矢量引用 (C++)
- 将 2D 数组指针传递给 C++ 中的函数
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 队列数组指针 (C++)
- C++数组指针上的删除操作
- 对于循环不循环和检测字符数组 [指针和字符数组]
- 如何初始化数组指针对象
- 如何正确传递 2D 数组指针作为参数
- 从数组指针中获取怪异的数字
- 初始化std :: unique_ptr作为原始数组指针的初始化
- 将结构数组指针从C#传递到C
- STD :: Sort将数组指针设置为NULL
- C++数组指针错误无法将“int*”转换为“int**”