2013-12-12 241 views
-1

所以我遇到了一個結構向量超出範圍的問題。我不知道爲什麼。我之前使用過載體,但由於某些原因,這不起作用。我看了幾個論壇,並嘗試了幾個不同的東西來解決這個問題。矢量超出範圍

構造函數和DirectMap方法都在main中調用。我想讓這兩個方法都保持在範圍內。這可能嗎?非常感謝幫助人!

繼承人如何,我宣佈它在headerfile:

struct input 
{ 
    bool dirtyBit; 
    int statusBit; //0 not in cache, 1 in cache, 2 in 2nd cache 
    bool writeStatus; //write = 1 read = 0 
    int address; 
    int indivBlockIndex; 
    int indivBlockOffset; 
}; 
    class Cache 
    { 

    public: 

     vector<input *> dataBase; 
     Cache(string); 
     ~Cache(); 

     void DirectMapped(int, int); 
    }; 

我繼承人如何使用它:

Cache::Cache(string infile) 
{ 
    ifstream in(infile); 

    string readWriteStatus; 
    int Addr; 
    while (in >> readWriteStatus >> hex >> Addr) 
    { 
     input *contents; 
      contents = new input; 
     contents->dirtyBit = false; 
     contents->statusBit = 0; 
     dataBase.push_back(contents); 
    } 
} 

Cache::~Cache(){} 

void Cache::DirectMapped(int cacheSize, int blockSize) 
{ 
    //initial stats needed 
    int blockCount = cacheSize/blockSize; //number of total blocks 
    //clear out the cache 
    for (int i = 0; i <= dataBase.size(); i++) 
     dataBase[i]->statusBit = 0; 
//other irrelevent stuff after this 
} 

再次感謝您抽出寶貴時間來幫助我。

+0

永遠不會爲'contents'和push_back分配內存給dataBase? – billz

+1

你在*未定義的行爲*土地:你需要爲'countents'分配內存(並釋放它)。 – Bathsheba

+1

你的問題(也就是代碼)是有道理的......首先你有一個指針向量,但是你沒有實例化結構,你聲明瞭一個指針,然後嘗試設置一些成員,然後將這個指針放入向量中...你真的需要檢查你的代碼... – Nim

回答

2

問題是,你正在向你的向量中存儲指向input結構體的指針,但是你從未將它們指向任何地方。一個簡單的修正可能改變

input *contents; 

input *contents = new input; 

然而,原料管理點的矢量擁有各種惱人的後果。在你的特定情況下,我認爲沒有理由首先保存指針向量。只需使用

vector<input> dataBase; 

...並存儲實際結構。

+0

我刪除了一些代碼,以便我更有意義。如果我使用你寫的最後一行(這是我如何開始實現它),當它離開構造函數時它會自動超出範圍。 – user3084848

+0

@ user3084848:當存在構造函數時,'dataBase'當然不會超出範圍,它是類的成員,即所有函數都可以訪問它。它只在退出該類的析構函數時纔會超出範圍。您可以通過向您的類中添加一個定製的'struct'成員來驗證這一點,該類在析構函數中輸出消息,然後觀察該消息何時被打印。 –