当我在Visual Studio 2008的发布配置中构建解决方案时,我遇到了使用c ++向量的问题。该代码在Debug配置中工作正常。我在网上搜索过,找不到能解决我所遇问题的解决方案。
这是我的代码的解释。我已经定义了一个类如下。该类存储飞机的一些参数,包括其在太空中的位置等。
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时,它崩溃了我使用push_back()函数的类的update()函数。
我希望我能很好地解释我的问题。如果需要更多信息,请告诉我。
如果有任何帮助,我将不胜感激。
艾哈迈德
答案 0 :(得分:1)
仅在发布模式下发生的崩溃几乎总是由于未初始化的内存。
调用PLANE02函数时,FileIndexStart,FileIndexStep和FilIndexEnd设置为什么?另外,你可以检查在崩溃之前实际调用push_back的次数吗? (例如,在循环中使用std::cout<<(i - ListStart)<<std::endl;
)