2016-11-09 161 views
0

正如标题所示,我想重新创建一个与原始大小不同的数组。使用Memcpy来扩大指针数组的大小

我的原始数组是在启动类时创建的,并且它在类的私有成员中。该数组被称为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,它指出它不能从节点**转换成节点* [10]。为什么是这样?是因为Arr是在班级第一次发起时启动的吗?

将鼠标悬停在newArr上显示Node **,同时悬停arr显示Node * Map :: arr [10]。有人可以解释我的选择,因为我想坚持阵列,我不想改变向量。我知道问题是他们没有被归类为相同的类型,但是如果我删除了newArr = new Node * ect行中的第二个星号,它说它不能转换。

感谢您抽出式阅读我的问题,我希望这个问题是正确的格式,视

回答

0

你需要让arrNode**类型。像

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

在类声明中应该做的。您现在需要析构函数(释放内存),复制构造函数(创建数组的副本)和复制赋值运算符(或者您可以删除最后两个)。如果效率很重要,您还需要移动构造函数和移动赋值操作符。

或者,而不是创建堆上的初始改编,你可以写:

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得到的东西。

最后,真的请重新考虑使用矢量。它使这很简单很多,并且在你自己的实现上基本上没有任何开销(并且实际上可能更快/更紧凑)。

4
Node* arr[10] 

arr是10个指针数组Node

更重要的是,它是一个自动的成员变量。它作为“Class”实例的子对象存储。

delete[] arr; 

你可能不调用成员阵列上delete[]。这有未定义的行为。你只可以在指针(这arr不是),这是通过调用返回到调用new[]delete[]

它设置了10 原本的尺寸...

的类型构件的是“10个对象数组”。程序执行期间,变量的类型永远不会改变。因此,成员的大小将永远不会改变。如果尺寸为10“最初”,它始终是10。

Node** newArr 

newArr是一个指向指针的Node。这与数组基本上不同。

= new Node*[newSize]; 

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

arr = newArr; 

这是不对的。你不能分配给一个数组。


除了无法调整大小的成员数组之外,您可以使用可指向动态分配数组的成员指针。这个成员指针可以被分配给另一个更大的数组(只记得不泄漏前面的数组)。

手册内存管理是很容易但是做不对,这将是方便的包装,我是分配动态内存的容器中所描述的成员指针,并relases它破坏。标准库中已经存在这样的容器:std::vector

//Part Of Class 
private:     
std::vector<Node*> arr = std::vector<Node*>(10); 


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