2016-06-01 45 views
0

請幫助我理解這種情況:
我在存儲數據的一個項目到struct一個vector,我的目標是讓他們活着,直到我調用一個函數來處理數據,然後將它們清除到隊列中。但我的問題是我不知道如何安全地擦除向量中的元素,如果我使用new運算符分配struct
實施例:
刪除向量的元素,它是使用new操作符allocted

//definition of truct 
struct MData { 
    int dHeight; 
    int dWidth; 
}; 

//definition of queue 
std::vector< MData* > dataQueue; 

這是我在隊列中存儲的數據:

//when got the data 
MData* mData = new MData; 
mData->dHeight = sourceHeight; 
mData->dWidth = sourceWidth; 

//Then put it in the queue 
dataQueue.push_back(MData); 

計算後,我要刪除的第一元件在隊列
所以我應該使用什麼方法:delete dataQueue.front()?釋放內存。或者使用dataQueue.erase(dataQueue.front())
預先感謝您。

+0

我認爲你有一個類型錯誤 - 你的std :: vector 有MDatas(實際的結構),但你試圖把一個指針推向MData。這是行不通的。要清理由new分配的結構,請嘗試先從列表中刪除它,然後刪除指針。 (你不需要分兩步做,但它可以更容易地看到發生了什麼。) –

+0

dataQueue.push_back(MData);'不會編譯,因爲'MData'是一個結構體,而不是一個對象。 'mData-> dWidth = sourceWidth'不會編譯,因爲您忘記了分號。所以我100%肯定那**不是**你如何在隊列中存儲數據。 – immibis

+0

對不起,我發佈時沒有任何編譯器,我只是簡單地發短信給上面的代碼。我編輯了這些錯誤。 –

回答

4

爲什麼你會分配MData使用new?它足夠小,您可以將其分配到自動存儲器中,尤其是因爲您的dataQueue已被定義爲按值(而不是指針)保存MData實例。因此:

MData mData{sourceHeight, sourceWidth}; 
dataQueue.push_back(mData); 
+4

或'dataQueue.push_back({sourceHeight,sourceWidth});'或'dataQueue.emplace_back(sourceHeight,sourceWidth);' –

+0

注意OP:在這種情況下,mData被複制到未引用或移動的向量中。 –

0

假設你使用的是C++ STL隊列庫,

MData* firstelement = dataQueue.front(); 
dataQueue.pop(); 
delete firstelement; 

編輯:由戴夫指出的那樣,你需要定義矢量如下:

std::vector< MData* > dataQueue; 
+1

不,最好使用'std :: vector '(按值存儲'MData')比'std :: vector '更好(通過_raw_指針存儲'MData')。原始指針的容器是一個反模式。如果你必須使用一個指針的容器,使用一個像std :: unique_ptr這樣的智能指針。但是在這個例子中,它並沒有被調用(它只是一個2'int'的結構)。按價值存儲更好。 –

+1

'MData firstelement'應該是'MData * firstElement' –

+0

對不起,我的壞。 謝謝指出! –

1

既然你要使用的載體,沒有必要住在外面它裏面的對象,最好的做法是佈設直接的載體內:

struct MData { 
     MData(const int dHeight,const int dWidth):dHeight(dHeight),dWidth(dWidth){} 
     int dHeight; 
     int dWidth; 
    }; 
    std::vector<MData> dataQueue; 
    dataQueue.emplace_back(sourceHeight,sourceWidth); 

Online Demo