вектор объектов для использования с вектором указателей - PullRequest
1 голос
/ 08 февраля 2012

Прокси-объекты, сгенерированные 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 ]

3 голосов
/ 08 февраля 2012

rateObjectList.reserve(7) фактически не выделяет и не создает никаких ota__RoomRateType объектов; он просто просит, чтобы вектор расширил свою емкость, чтобы вместить 7 объектов.

Потенциально, вы хотели rateObjectList.resize(7). Или std::vector<ota__RoomRateType> rateObjectList(7);, если вы знаете число во время создания вектора.

0 голосов
/ 08 февраля 2012

Можете ли вы объяснить, почему?

Конечно.Если кто-то держит roomRates, когда rateObjectList уничтожен, то любая попытка использовать указатель из roomRates может вызвать SEG_FAULT.В любом случае, это плохая идея.

Это лучше в этом случае

vector.push_back(new Object());

Еще лучше использовать умные указатели, такие как boost::shared_ptr

...