2012-06-10 30 views
0

我已經爲學校的目的使用模板自己動手分配的數組。動態空間分配在這個算法中如何實際工作?

雖然我即將問的作品,我不知道如何以及爲什麼,我已經達到了我需要知道的地步。

template <typename TElement> 
DynamicArray<TElement>::ensureCapacity() { 
    if (capacity >= elemNumb) { 
     return; //we have space to store the values 
    } 
    //we need to allocate more space for the values 
    TElement *auxArray = myArray; 
    //create space to hold more numbers 
    capacity = capacity * 2; 
    myArray = new TElement[capacity]; 
    //copy the values 
    for (int i = 0; i < size; i++) { 
     myArray[i] = auxArray[i]; 
    } 
    //release the memory 
    delete[] auxArray; 
} 

我需要知道:TElement *auxArray = myArray;這是如何工作的?它是使用指針,是一個接一個地拷貝元素嗎?我需要了解它是如何工作的,以便我可以弄清算法的複雜性。我不介意,如果有人告訴我的複雜性,但我正在尋找的真正答案是如何工作?

myArray = new TElement[capacity];我這樣做之前刪除舊myArray這是否刪除舊的?或者它仍然以某種形式在內存中的某處浮動?

+4

澄清;你是說你寫了這段代碼,但是你不知道它是如何工作的? –

+0

@OliCharlesworth Well ofc。 C++非常複雜。我對此沒有完全的理解。我可以很容易地做一些愚蠢的事情,比如創建500動態分配的數組,並且不需要取消分配它們並流暢地使用內存,但是我不知道,因爲500 * 10 int不是那麼大的內存(0.019 mb)。我感冒並沒有注意到,即使這是生與死的區別。 – Kalec

+1

理解所有這些東西至關重要,但在真實代碼中,您應該優先使用指向動態分配對象的原始指針的智能指針。看看[C++ 11智能指針](http://en.wikipedia.org/wiki/Smart_pointer) – juanchopanza

回答

2

TElement *auxArray = myArray; 

只是意味着auxArray點到任何myArray指向。沒有任何其他的複製,它只是一個指針副本。

myArray = new TElement[capacity]; 

意味着myArray現在指向一個新的,動態分配的TElement陣列。表達式不會刪除任何內容。但auxArray指向myArray在此作業之前指向的內容,因此當您刪除auxArray時,會釋放myArray最初指向的資源。

+0

好的,這就是所有的一切。謝謝! – Kalec

+0

@Kalec很好聽。那麼也許你可以接受答案,這樣其他讀者就不會認爲你的問題仍然沒有答案。 – juanchopanza