2021年2月27日 星期六

[Effective C++] [閱讀心得]: 關於建構函式與解構函式

 為Base class宣告virtual的解構函式


class Base {
public:
    Base();
    ~Base();
    ...
};

class Derived : public Base { ... };

Base *getBase() { ... }

void foo() {
    Base *base = getBase();
    ...
    delete base;
}

這段程式碼中,getBase()回傳一個指標,此指標可能指向一個Base物件或是Derived物件。假設今天base指向了一個Derived的物件,那麼後面的delete base可能會導致物件無法完全銷毀的問題。

2021年2月20日 星期六

[Effective c++] [閱讀心得]: 條款13: 以對象管理資源

Photo by Alvaro Reyes on Unsplash

class A { ... };

void foo() {
    A a = new A;
    ...
    if (...) {
        delete a;
        return;
    }
    ...
    delete a;
    return;
}

如同上面的例子,因為if condition成立時foo()會提前return,所以必須在其中delete a,以免產生記憶體洩漏。
然而,這樣的撰寫風格其實具有極高的風險性。