2016-03-25 1 views
0

なぜこのコード行のセグメンテーションフォルトが発生しているのか分かりませんが、アクセスできないメモリ部分にアクセスしようとしているときにエラーが発生することがわかります何が間違っているのか理解する。セグメンテーションフォールトコアがダンプされたC++

私はシーン間で変更しようとしています。ベクトルにオブジェクトをプッシュする関数を置くことによって、セグメンテーションフォールト(コアダンプ)が発生します これは球と平面を押したときに発生します。それが動作しますが、それはもちろん、球をレンダリングしません.. アイデア? 「if文」を削除しても動作します ありがとうございます。

vector < Source * > lightSource; 
vector < Object * > sceneObjects; 

while (!glfwWindowShouldClose(window)) { 
    if (firstScene) { 
     Sphere sphereScene(sphere, .825, green_ref); 
     Plane planeScene(plane[0][0], plane[0][1], -1, maroon); 
     Light lightScene(light, whiteLight); 

     ////////////this is what is causing problem i think////////////////// 
     sceneObjects.push_back(dynamic_cast < Object * > (& sphereScene)); 
     sceneObjects.push_back(dynamic_cast < Object * > (& planeScene)); 
     ///////////////////////////////////////////////////////////////////// 

     lightSource.push_back(dynamic_cast < Source * > (& lightScene)); 
     for (int i = 0; i < 4; i++) { 
      sceneObjects.push_back(new Triangle(pyramidCoord[i], Blue)); 
     } 
     for (int i = 0; i < 2; i++) { 
      sceneObjects.push_back(new Triangle(ceiling[i], White)); 
     } 
     for (int i = 0; i < 2; i++) { 
      sceneObjects.push_back(new Triangle(wallG[i], Green)); 
     } 
     for (int i = 0; i < 2; i++) { 
      sceneObjects.push_back(new Triangle(wallR[i], Red)); 
     } 
     for (int i = 0; i < 2; i++) { 
      sceneObjects.push_back(new Triangle(floor1[i], White)); 
     } 
    } 
+0

にそれは、コードスニペットを読むのは難しいように私の関数の定義がどのように見えるかである - ブレース(複数可)が欠落しているように見えます。インデントが正しい場合、Sphere、Plane、Lightオブジェクトの有効期間はifブロックの後で終了します。しかし、現在未定義のメモリへのポインタは、sceneObjectsリストに格納されており、後でアクセスすることができます(クラッシュする可能性があります)。 Triangleのように新しいものを使ってみませんか? – Anders

+0

良い点私はこのsceneObjects.push_back(新しい球(球、.825、green_ref))に変更しました。sceneObjects.push_back(new Sphere(plane [0] [0]、plane [0] [1]、-1、mroon)); lightSource.push_back(new Light(light、whiteLight));私は別のエラーを取得していませんが、そのセグメンテーションフォルトはもうありません – blank

+0

よろしく!次回は、MVCE(Minimal Complete Verifiable Example)http://stackoverflow.com/help/mcveを投稿して、推測する必要はありません。 – Anders

答えて

0

ローカルスタックベースの変数のアドレスを、後で動的に割り当てられたオブジェクトを追加するコンテナにプッシュしています。これらの変数が破棄された後は、ローカル(sphereSceneplaneScene)を参照している可能性があります。割り当てられたすべての三角形のメモリをクリーンアップすることも問題です。ローカルのメモリを削除できないためです。

ObjectSphereなどのベースであると仮定すると、ポインタを格納するのに、dynamic_castは必要ありません。

0

これは

sceneObjects.push_back(new Sphere(sphere,.825,green_ref)); 
sceneObjects.push_back(new Sphere(plane[0][0],plane[0][1], -1, maroon)); 
lightSource.push_back(new Light(light,whiteLight)); 

それを修正したが、今私は別のエラーに

エラー取得しています:「スフィアへの呼び出しに該当する機能::スフィア(GLM :: vec3 &、GLM :: vec3 &を、int、Color &) ' sceneObjects.push_back(new Sphere(plane [0] [0]、plane [0] [1]、-1、maroon));

これはsphere.h

#ifndef SPHERE 
#define SPHERE 


class Sphere : public Object { 
    vec3 center; 
    double radius; 
    Color color; 

public: 
    Sphere(); 
    Sphere(vec3, double, Color); 
}; 


Sphere::Sphere() 
{ 
    vec3 center(0,0,0); 
    radius=1.0; 
    color= Color(0.5,0.5,0.5,0); 
} 

Sphere::Sphere(vec3 centerV, double radiusV, Color colorV) 
    { 
     center=centerV; 
     radius=radiusV; 
     color=colorV; 
    } 


#endif // SPHERE 
+0

関数プロトタイプには参照( 'glm :: vec3&')があり、関数定義には( 'vec3')はありません。 – 1201ProgramAlarm

+0

私は球を押すのではなく、球を2回押していたことは心配しません。この質問をすべてあなたに感謝したと考えてください。 – blank