2014-09-06 55 views
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 
....... 

回答

0
vec1[0] = 0; vec1[1] = -1; vec1[3] =0; 

在3D矢量最後指數是2,而不是3

+0

是不應該在試圖在'VEC 1分配錯誤的索引值的時候拋出一個異常,編譯器[3] = 0;'?否則,我們幾乎沒有機會去捕捉它。 – 2014-09-06 07:12:40

+1

@SonyaBlade - No. C++不能這樣工作。如果'throw'沒有被庫顯式編碼,則不會拋出異常。你將進入「未定義行爲」的世界,任何事情都可能發生。 – PaulMcKenzie 2014-09-06 07:16:10

+1

@SonyaBlade:C++標準庫很少使用異常來報告錯誤。而在C++的範圍內,這是一件好事。 C++中的例外情況不應該用於彌補編程錯誤,並且非法的向量索引發生在如此低的級別以致它必定是編程錯誤,即您的*代碼*是錯誤的。不過,編譯器可以通過執行自己的檢查來「填充」UB。當索引超出範圍時,它可能會使用內部的'assert'來使程序崩潰。 – 2014-09-06 11:11:34