0
當我使用OpenSceneGraph庫(OSG 3.0; GCC 4.7.1; C :: B 13.12)時,我遇到了一個非常有趣的數組問題。它聲明Vec3Array類的類型是從vector類派生的,所以通常我們期望Vec3Array和vector類具有相同的功能和相同的繼承行爲。stl_vector.h頭文件中的分段錯誤
我有3個Vec3Array列表第一個爲頂點,第二個爲法線和第三個爲索引。我創建1st並用填充值來調用正確的push_back函數,然後創建第二個值並填充值,但如果我想返回第一個列表(使用cnt = obj_vertices->size();
代碼),則程序會引發異常。
這裏有什麼問題?
osg::ref_ptr<osg::Vec3Array> obj_vertices = new osg::Vec3Array; ////1st LIST
obj_vertices->push_back(osg::Vec3d(-3.0000, 0.0, 4.0000));
obj_vertices->push_back(osg::Vec3d(3.0000,0.0, 4.0000 ));
.......
osg::Vec3d vec1, vec2, vec3;
osg::ref_ptr<osg::Vec3Array> normals = new osg::Vec3Array; // 2nd LIST
vec1[0] = 0; vec1[1] = -1; vec1[3] =0;
vec2[0] = 1; vec2[1] = 0; vec2[3] = 0;
vec3[0] = 0; vec3[1] = -1; vec3[3] =0;
normals->push_back(vec1);normals->push_back(vec1);normals->push_back(vec1);normals->push_back(vec1);
normals->push_back(vec1);normals->push_back(vec1);normals->push_back(vec1);normals->push_back(vec1);
normals->push_back(vec1);normals->push_back(vec1);normals->push_back(vec1);normals->push_back(vec1);
normals->push_back(vec2);normals->push_back(vec2);normals->push_back(vec2);normals->push_back(vec2);
normals->push_back(vec2);normals->push_back(vec2);normals->push_back(vec2);normals->push_back(vec2);
normals->push_back(vec3);normals->push_back(vec3);normals->push_back(vec3);normals->push_back(vec3);
cnt = obj_vertices->size(); /// EXCEPTION IS TRIGGERED HERE
.......
是不應該在試圖在'VEC 1分配錯誤的索引值的時候拋出一個異常,編譯器[3] = 0;'?否則,我們幾乎沒有機會去捕捉它。 – 2014-09-06 07:12:40
@SonyaBlade - No. C++不能這樣工作。如果'throw'沒有被庫顯式編碼,則不會拋出異常。你將進入「未定義行爲」的世界,任何事情都可能發生。 – PaulMcKenzie 2014-09-06 07:16:10
@SonyaBlade:C++標準庫很少使用異常來報告錯誤。而在C++的範圍內,這是一件好事。 C++中的例外情況不應該用於彌補編程錯誤,並且非法的向量索引發生在如此低的級別以致它必定是編程錯誤,即您的*代碼*是錯誤的。不過,編譯器可以通過執行自己的檢查來「填充」UB。當索引超出範圍時,它可能會使用內部的'assert'來使程序崩潰。 – 2014-09-06 11:11:34