2010-10-29 115 views
2

我是一名學生,編寫一個方法,以C++中的整數數組的末尾來刪除零。該數組在結構中,並且該結構還具有一個int,用於跟蹤數組的長度。當數組縮小時,是否需要刪除元素?

該方法檢查每個元素從最後一個開始,直到遇到第一個非零元素,並通過更改長度值將其標記爲「最後一個元素」。然後該方法回到原來的「最後一個元素」,刪除那些不在界限之外的元素(零)。

一個刪除數組中的i個元素如果i比數組的更新的長度越大部分,看起來像這樣:

if (i > p->length - 1) { 
    delete (p->elems + i); // free ith elem 

即線是錯誤的,雖然。刪除需要一個指針,是嗎?所以我的感覺是,我需要恢復指向數組的指針,然後將i添加到它,以便我將具有要刪除的整數的內存位置。

我的直覺是否錯了?錯誤是否微妙?或者,我有完全錯誤的想法嗎?我開始懷疑:我真的需要釋放這些原始物嗎?如果他們不是原始人,我需要,在那種情況下,我會怎麼樣?

+1

你可以展現結構的模樣和「P」的聲明? – 2010-10-29 23:28:00

回答

3

如果p->elems是一個指針的,那麼p->elems + i(假設操作定義,即我是整型) - 和p->elems + i == &p->elems[i]

總之,你很可能不希望(也不能)刪除整數(從動態或自動分配)。那就是

int* ptr = new int[10]; 
delete &ptr[5]; // WRONG! 

那簡直就是你不能做的事。但是,如果結構體包含數組的長度,那麼在更改結構體包含的長度信息後,可以考慮數組「調整大小」 - 畢竟,無法指出指針指向的數組大小。

但是,如果您的數組是指向整數的指針數組(int*[]),並且這些指針指向動態分配的內存,那麼是的,您可以刪除單個項目,然後沿着代碼行顯示這麼少的代碼很難準確)。

5

我有完全錯誤的想法嗎?

恐怕是這樣。

如果你讓一個new[]呼叫分配數組,那麼你必須做出一個delete[]調用釋放它:

int *p = new int[10]; 
... 
delete[] p; 

如果陣列是一個結構,而你打一個電話,來分配結構,那麼你必須撥打一個電話來釋放它:

struct Foo { 
    int data[10]; 
}; 

Foo *foo = new Foo; 
... 
delete foo; 

沒有辦法釋放數組的一部分。

一個int[10]數組實際上連續10個整數(即32位系統上的40個字節的內存,可能加上開銷)。整數它們存儲在數組中佔用該內存 - 它們本身不是內存分配,並且不需要釋放它們。

所有這一切說,如果你想有一個可變長度數組:

這就是標準::向量是

#include <vector> 
#include <iostream> 

struct Foo { 
    std::vector<int> vec; 
}; 

int main() { 
    Foo foo; 

    // no need for a separate length: the current length of the vector is 
    std::cout << foo.vec.size() << "\n"; 

    // change the size of the vector to 10 (fills with 0) 
    foo.vec.resize(10); 

    // change the size of the vector to 7, discarding the last 3 elements 
    foo.vec.resize(7); 
}