что не так с кодом при добавления элементов в массив больше 5 значений

Есть некая структура хранящая в себе std::vector

struct TRemoteQuestData
{
    bool bActivate;
    int nIndex;
    int nQuestID;
    bool bPreQuestCheckType;
    std::vector<int> nVecPreQuestCondition;
    TEventCondition GainCondition;
};

в этом коде когда достигает более пяти элемента в массиве происходит креш

TRemoteQuestData *pData = new TRemoteQuestData;
memset( pData, 0, sizeof(TRemoteQuestData) );

for( int j=0; j<10; j++ ) 
{
    int nPreQuestID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._PreQuestCondition[j] )->GetInteger();
    if( 0 == nPreQuestID )
        continue;

    pData->nVecPreQuestCondition.push_back( nPreQuestID );
}

крэш с надписью

Вызвано исключение: нарушение доступа для чтения.
**_Pnext** было 0x8.

но если прописать так то этой ошибки нету

TRemoteQuestData *pData = new TRemoteQuestData;
memset( pData, 0, sizeof(TRemoteQuestData) );


pData->nVecPreQuestCondition.resize(10);
for( int j=0; j<10; j++ ) 
{
    int nPreQuestID = pTable->GetFieldFromLablePtr( iIdx, sFieldNum._PreQuestCondition[j] )->GetInteger();
    if( 0 == nPreQuestID )
        continue;

    pData->nVecPreQuestCondition[j] = nPreQuestID;
}

объясните пожалуйста почему push_back крэшится и как это исправить, или все таки использовать 2-й вариант?


Ответы (1 шт):

Автор решения: Anaconda

Вы сами уже всё исправили. Лучше использовать второй вариант. Он более правильный (с точки зрения кода). Тем более у std::vector есть инициализирующий конструктор, в котором нельзя использовать 0 с помощью memset.

→ Ссылка