我有一個有四個成員的類,我沒有實作解構式。如果我洗掉物件,默認解構式將洗掉 4 個成員,對嗎?如果我制作一個空白的自定義解構式,它們都不會被洗掉?如果我制作一個只洗掉其中一個的自定義解構式,其他三個也會被洗掉嗎?
uj5u.com熱心網友回復:
認真回答你的問題
我不認為回答你的問題實際上對你有幫助,因為你提出問題的方式對你沒有幫助。但無論如何,這里是:
如果我洗掉物件,默認建構式將洗掉 4 個成員,對嗎?
正確的
如果我制作一個空白的自定義解構式,它們都不會被洗掉
不正確。仍然會正確洗掉所有成員。
如果我制作一個只洗掉其中一個的自定義解構式,其他三個也會被洗掉嗎?
解構式(也不是任何方法)不能合法地顯式洗掉它自己的成員。
解決您的困惑
Ifp是一個指標,當你這樣做時,delete p你不是在洗掉指標p,而是在洗掉 指向的物件p。p有沒有告訴你什么物件需要洗掉。之后delete p p還活著。當然它指向無效的記憶體,但它本身并沒有被洗掉。您可以分配給它并使其指向其他東西。
讓我們考慮一個具有 3 個成員的簡單類:一個浮點數、一個 int 指標和一個std::vector物件:
struct X
{
float f;
int* p;
std::vector<double> v;
};
您的類的 3 個成員是:浮點數、指標和std::vector物件。無論您有用戶定義的解構式還是隱式解構式,這些成員總是會被解構式正確銷毀。總是!全體會員!沒有例外。您不能以任何方式禁止或修改此行為。
因為f我認為沒有什么可以解釋的。
現在來看有趣的部分:p在這里您需要看到一個非常重要的區別:指標p(它是您的資料成員)和潛在的 int 物件指向p。與任何其他資料成員一樣,指標p將由解構式正確處理。
但是指標指向的物件應該p怎么辦呢?有幾種情況:您的指標可能指向一個 int 物件、指向 null、未初始化或指向無效地址。如果它指向一個 int 物件,它可能指向一個作為另一個型別別的子物件的 int 物件,它可能是陣列中的一個元素,它可能是一個靜態物件或具有自動存盤持續時間的物件,或者它可能是一個由 .創建的 int 物件new。如果它是由它創建的,那么洗掉它或不洗掉它new可能是X類的責任,如果它必須銷毀它可能會有一個復雜的決定(想想共享指標)。X應該洗掉piff指向的物件,該物件X擁有該指標的所有權,并且應該實作適當的邏輯。
如您所見,編譯器不可能知道指向什么p以及是否X應該洗掉它。這就是默認解構式不這樣做的原因。
同樣v,解構式(默認或用戶定義)將正確銷毀v。您現在可能在內部std::vector有一個自己的指標成員,但是:std::vector銷毀指標可能指向的陣列是 的責任,而不是X. 這一切都是開箱即用的,X不需要做任何特別的事情。
你應該怎么想
在 C 中有RAII原則,盡管它的名字很糟糕,但它是 C 中最重要的概念之一。基本上,如果您的班級獲得了需要手動管理的資源,那么該班級對該資源擁有所有權,并負責釋放該資源。因此,如果您的類進行手動記憶體分配(new),那么它負責呼叫相應的delete. 如果它通過虛構的方式獲取資源,resource_aquire()那么它也有責任呼叫伴隨的資源resource_destroy()
另一個重要原則是單一責任原則:如果您的類負責管理資源,那么該類應該只做那件事。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/490355.html
