Сбой кода C ++ при использовании вектора push_back в конфигурации RELEASE

У меня проблема с использованием векторов c ++, когда я строю решение в конфигурации выпуска Visual Studio 2008. Код отлично работает в конфигурации отладки. Я искал в Интернете и не нашел решения, которое решает проблему, которая у меня есть.

Вот объяснение моего кода. Я определил класс следующим образом. Этот класс хранит некоторые параметры для плоскости, включая ее местоположение в пространстве и т. Д.

class PIVPlaneConfig{

public:
int update(){

// Create the frame list for the PIV plane.
for ( int   i = ListStart ;
i <= ListEnd;
i = i + ListStep){
FramesList.push_back(i);
}

return 0;
};

~PIVPlaneConfig(){
DirRaw          = "";
DirProcessed    = "";
FnamePreVel     = "";

// Reset frames list
FramesList.clear();
};

std::string DirRaw;
std::string DirProcessed;
std::string FnamePreVel;
double pivScaleFactor;
double pivUnitFactorXY;
double pivUnitFactorVxVy;
Point2D planeOriginLocal;
Point3D planeOriginGlobal;
Point3D planeNormal;

bool CS;
int OutOfPlaneVelocity;

// Image Processing Configuration.
std::string FnamePreRawImage;
std::string FnameMaskImage;
int ElemShape;
int ElemShapeCols;
int ElemShapeRows;
Point2D ElemShapeAnchor;
int pivResolutionHorizontal;
int pivResolutionVertical;

// File listing.
int ListStart;
int ListStep;
int ListEnd;
std::vector < int > FramesList;
int nPlanes;

};

У меня есть функция, в которой я настраиваю 12 различных PlaneConfigs:

int PlaneConfigInit( int FileIndexStart, int FileIndexStep, int FileIndexEnd, vector < PIVPlaneConfig >& Planes )

Каждый PlaneConfig будет инициализирован следующим образом в функции PlaneConfigInit. Для простоты я привел только инициализацию PLANE01.

double CatiaScalingFactor = 3.8 / 84.839;

PIVPlaneConfig Plane;

// PLANE01
pivPlane.DirRaw = "Y:\\Rectangular\\Sagittal_01_001";
pivPlane.DirProcessed = "Y:\\Rectangular\\Sagittal_01_001\\Processed";
pivPlane.FnamePreVel = "Sagittal_01_";
pivPlane.FnamePreRawImage = "Sagittal_01_";
pivPlane.OutOfPlaneVelocity = FR3D_MISSING_OUT_OF_PLANE_W;

//  File list.
pivPlane.ListStart = FileIndexStart;
pivPlane.ListStep = FileIndexStep;
pivPlane.ListEnd = FileIndexEnd;

pivPlane.planeOriginLocal.x = 0;
pivPlane.planeOriginLocal.y = 0;

pivPlane.planeOriginGlobal.x = -39.206  * CatiaScalingFactor;
pivPlane.planeOriginGlobal.y = 100.0    * CatiaScalingFactor;
pivPlane.planeOriginGlobal.z = -52.316  * CatiaScalingFactor;

//  Plane unit normal vector.
pivPlane.planeNormal.x = 0;
pivPlane.planeNormal.y = 0;
pivPlane.planeNormal.z = 1.0;

pivPlane.CS = FR3D_CS_RECT;
pivPlane.update();
pivPlanes.push_back( pivPlane );
pivPlane.~PIVPlaneConfig();

Я точно использую приведенный выше код для второй плоскости и продолжаю его до тех пор, пока все 12 плоскостей (PLANE01, PLANE02, …, PLANE12) не будут инициализированы, все внутри функции PlaneConfigInit. Это отлично работает в отладке, но не в выпуске. Инициализация PLANE01 выполняется без сбоев, но когда дело доходит до PLANE02, происходит сбой при функции update () класса, в котором я использовал функцию push_back ().

Надеюсь, я хорошо объяснил свою проблему. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Буду благодарен за любую помощь.

Ahmad

-1

Решение

Сбои, которые происходят только в режиме Release, почти всегда происходят из-за неинициализированной памяти.

Каковы значения FileIndexStart, FileIndexStep и FilIndexEnd при вызове функции для PLANE02? Кроме того, вы можете проверить, сколько раз фактически вызывается push_back перед сбоем? (Например, используя std::cout<<(i - ListStart)<<std::endl; внутри петли)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]