2012-02-08 109 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