簡體   English   中英

嵌套類中的 std::stack 數據成員導致內存泄漏

[英]std::stack data members in nested class causing memory leak

我的代碼中存在內存泄漏,因此我將其剝離以進行調試。 罪魁禍首是 Solitaire::State 結構中的 std::stack 數據成員。 它特別是嵌套狀態結構中的那些; 如果我將堆棧數據成員添加到 Solitaire 類,它就不會泄漏。

我究竟如何確保這些堆棧被釋放?

#include <iostream>
#include <fstream>
#include <stack>

class SearchState {
public:
protected:
};

class SearchDomain {
public:
    ~SearchDomain();
protected:
    SearchState* init = nullptr;
};

SearchDomain::~SearchDomain() {
    if (init != nullptr)
        delete init;
}

class Solitaire : public SearchDomain {

    enum {
        Npos = 13,
        Nrank = 13,
        Nsuit = 4,
        Ncards = Nrank * Nsuit,
        Ndeck = 24,
        Nfound = 4,
        Ntab = 7,

        pDeck = 0,
        pPile = 1,
        pFound = 2,
        pTab = 6
    };

public:

    struct State : public SearchState {
    public:
        State(std::ifstream& in);
        ~State();
    private:
        int pos = 0;
        std::stack<int> Deck;
        std::stack<int> Pile;
        std::stack<int> Found[Nfound];
        std::stack<int> TabV[Ntab];
        std::stack<int> TabH[Ntab];
    };
    
    Solitaire(std::ifstream& in);
private:
};

Solitaire::Solitaire(std::ifstream& in) {
    init = new State(in);
}

Solitaire::State::State(std::ifstream& in) {

}

Solitaire::State::~State() {

}

int main() {
    while (true) {
        std::ifstream in("instance.txt");
        Solitaire* s = new Solitaire(in);
        in.close();
        delete s;
    }
}

由於Solitaire繼承自SearchDomain ,但您的SearchDomain析構函數刪除了指向基類SearchState的指針,因此基類需要有一個虛擬析構函數。

class SearchState {
friend class SearchDomain;
protected:
    virtual ~SearchState() = default;
};

沒有這個, Solitaire::State的析構函數不會被調用,因此它的成員也不會被銷毀。

該標准沒有定義在沒有虛擬析構函數的情況下從基類指針銷毀派生類的方法。 因此,從技術上講,刪除指向派生對象的向下轉換指針而沒有基類中的虛擬析構函數是未定義的。

可以在此處找到有關何時使用虛擬析構函數的更多信息。

在線試試吧!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM