你的問題有點抽象,我不確定我能否很好地回答,但這裏是我對他們每個人的看法。就我個人而言,我不同意這些東西中的一些是工作最好的設計,但那不是你的問題,而是一個意見問題。
虛擬代理 我不明白你在這裏想說什麼。這裏的模式的要點是,你可能有一個對象A,你知道它需要100MB,並且你不知道你將永遠需要使用這個對象。
爲避免爲該對象分配內存,直到需要時創建一個虛擬對象B,該對象實現與A相同的接口,並且如果調用其任何方法B創建A的實例,從而避免分配內存直到它是必要的。
保護代理 在這裏,我認爲你誤解了模式的使用。這個想法是能夠動態地控制對象的訪問。例如,您可能希望A類能夠訪問B類的方法,除非條件C爲真。正如我相信你可以看到這不能通過使用訪問說明符來實現。
智能退避 在這裏,我想你誤解了智能指針的需求。由於這是一個相當複雜的話題,我只是簡單地提供一個關於它們的問題的鏈接:RAII and smart pointers in C++
如果你從來沒有用自己管理你的記憶的語言編程,那麼這可能會解釋混淆。
我希望這有助於回答您的一些問題。
編輯:
我沒有注意到這個被標記C++,所以我假設你其實認識到需要清理動態內存。單個靜態引用計數僅在您打算只有一個對象實例時纔有效。如果你創建了一個對象的2000個實例,然後刪除了1999個對象,那麼它們都不會釋放它們的內存,直到最後一個對象的範圍顯然不可取爲止(假設你已經跟蹤了所有分配的內存的位置爲了能夠釋放它!)。
編輯2:
假設你有一個類,如下所示:
class A {
public:
static int refcount;
int* allocated_memory;
A() {
++refcount;
allocated_memory = new int[100000000];
}
~A() {
if(! --refcount) {
delete [] allocated_memory;
}
}
}
和使用它的一些代碼:
int main() {
A problem_child; // After this line refcount == 1
while(true) {
A in_scope; // Here refcount == 2
} // We leave scope and refcount == 1.
// NOTE: in_scope.allocated_memory is not deleted
// and we now have no pointer to it. Leak!
return;
}
正如你可以在代碼中引用計數看到計算所有引用所有對象,並導致內存泄漏。如果你需要,我可以進一步解釋,但這本身就是一個單獨的問題。
來源
2012-03-12 10:46:47
sji
你說過:「*如果你創建了2000個對象實例,然後刪除了1999個對象,那麼它們都不會釋放它們的內存直到最後一個剩下的範圍*」我不明白爲什麼會發生這種情況,請詳細說明。 – 2012-03-13 06:24:59
@AnishaKaul我會在上面的回答中回答 – sji 2012-03-13 10:06:33
@AnishaKaul Done,正如我所說這應該是它自己的問題,我提供的鏈接對問題有很好的解釋。 – sji 2012-03-13 10:20:12