2012-02-08 135 views
1

由gSOAP的生成代理對象的矢量使用指示該使用指針的向量:矢量具有指針

class SOAP_CMAC ota__RoomStayTypeRoomRates 
{ 
public: 
    std::vector<class ota__RoomRateType * >RoomRate; 
    //.... 
}; 

而不是使用:

vector.push_back(new Object()); 

然後將具有刪除對象時,我想我可能會創建一個對象向量,然後使用這些對象的地址,因爲當向量超出範圍時它們將被銷燬,從而避免內存泄漏:

OTARoomRates roomRates; 

std::vector<ota__RoomRateType> rateObjectList; 

rateObjectList.reserve(7); 
for (int i = 0; i < 7; i++) 
{ 
    rateObjectList[i].RoomTypeCode = &roomTypeCode; 
    rateObjectList[i].RatePlanID = &ratePlanID; 
    //... 
    roomRates.RoomRate.push_back(&rateObjectList[i]); 
} 

我收到段錯誤。我想這是一個壞主意。你能解釋爲什麼嗎?

回答

3

rateObjectList.reserve(7)實際上並未分配或構造任何ota__RoomRateType對象;它只是要求矢量擴展其容量足以容納7個對象。您可能需要rateObjectList.resize(7)。或者如果您知道創建矢量時的編號,則可以使用std::vector<ota__RoomRateType> rateObjectList(7);

+0

謝謝!這就是問題......(等待3分鐘來接受答案) – 2012-02-08 09:51:22

0

你能解釋一下爲什麼嗎?

當然。如果某人在rateObjectList銷燬時持有roomRates,則嘗試使用roomRates中的指針可能會導致SEG_FAULT。無論如何,這是一個壞主意。

這是在這種情況下

vector.push_back(new Object()); 

更妙的是更好地使用智能指針,就像boost::shared_ptr

+0

提升很不錯,但我認爲它可能無法與gSoap生成的類一起使用。它僅用於生成SOAP請求。所以這兩個向量都在相同的範圍內。 – 2012-02-08 09:55:57

+0

@sims好吧,現在很清楚 – maverik 2012-02-08 10:06:07