2016-11-09 36 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);