向量的矢量与指针矢量使用

时间:2012-02-08 09:38:07

标签: c++ gsoap std

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]);
}

我遇到了段错误。我认为这是一个坏主意。你能解释一下原因吗?

2 个答案:

答案 0 :(得分:3)

rateObjectList.reserve(7)实际上并不分配或构造任何ota__RoomRateType个对象;它只是要求向量扩展其容量足以容纳7个对象。

您可能想要rateObjectList.resize(7)。如果您知道矢量创建时的数字,请std::vector<ota__RoomRateType> rateObjectList(7);

答案 1 :(得分:0)

  

你能解释一下原因吗?

不确定。如果某人在roomRates被销毁时持有rateObjectList,那么任何使用roomRates指针的尝试都可能导致SEG_FAULT。无论如何,这是一个坏主意。

在这种情况下这更好

vector.push_back(new Object());

更好的是使用智能指针,例如boost::shared_ptr