2016-03-25 16 views
0

nicht sicher, warum ich segmentation Fehler für diese bestimmte Codezeile bekomme, ich weiß, dass Sie diesen Fehler erhalten, wenn Sie versuchen, auf einen Teil des Speichers zugreifen, die Sie nicht zugreifen können, aber ich kann Finde heraus, was falsch ist.Segmentierung Fehler Core Dumped C++

Ich versuche, zwischen Szene zu wechseln, und indem ich die Funktion, die das Objekt in Vektor schiebt, bekomme ich Segmentierungsfehler (Core Dumped) , dies geschieht nur, wenn ich die Kugel und Ebene drücken, wenn ich diese 2 Zeile kommentieren es funktioniert, aber dann wird es nicht die Kugel natürlich machen .. irgendwelche Ideen? es funktioniert auch, wenn ich die "if-Anweisung" danke entfernen.

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

Es ist schwer aussieht - scheint Klammer zu fehlen (s). Wenn die Einrückung richtig ist, endet die Lebenszeit von Sphere, Plane und Light nach dem if-Block. Aber hängende Zeiger auf diesen jetzt undefinierten Speicher sind in der Liste der sceneObjects gespeichert und können später aufgerufen werden (und abstürzen). Warum nicht neu wie Triangle? – Anders

+0

good point ich habe es in diese sceneObjects.push_back geändert (new Sphere (sphere, .825, green_ref)); sceneObjects.push_back (new Sphere (Ebene [0] [0], Ebene [0] [1], -1, m aroon)); lightSource.push_back (neues Licht (Licht, Weißlicht)); nicht ich bekomme diffrent error, aber es ist nicht segmentation fehler mehr – blank

+0

Yay! Das nächste Mal ist es wichtig, ein minimales vollständiges verifizierbares Beispiel (MVCE) http://stackoverflow.com/help/mcve zu veröffentlichen, so dass wir nicht raten müssen. Nun zu deinem nächsten Problem ;-) – Anders

Antwort

0

Sie schieben die Adresse einer lokalen stackbasierten Variablen in einen Container, dem Sie später dynamisch zugewiesene Objekte hinzufügen. Sie verweisen wahrscheinlich auf das lokale Objekt (sphereScene, planeScene), nachdem diese Variablen zerstört wurden. Das Bereinigen des Speichers für all die zugeordneten Dreiecke ist ebenfalls ein Problem, da Sie den Speicher für die Einheimischen nicht löschen können.

Angenommen, Object ist eine Basis von Sphere et al, sollten Sie die dynamic_cast nicht benötigen, um den Zeiger zu speichern.

0

diese Fest es

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)); 

aber jetzt bekomme ich einen anderen Fehler

Fehler: keine passende Funktion für Aufruf von ‚Sphere :: Sphere (GLM :: vec3 &, glm :: vec3 & , int, Farbe &) ' sceneObjects.push_back (neue Sphere (Ebene [0] [0], Ebene [0] [1], -1, Kastanienbraun));

dies ist, wie meine Funktion Definition wie in sphere.h

den Code-Snippet zu lesen
#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

Der Funktionsprototyp hat Verweise ('glm :: vec3 &'), während die Funktionsdefinition nicht ('vec3') hat. – 1201ProgramAlarm

+0

macht mir nichts aus, dass ich Sphere zwei mal drängen musste anstatt das Flugzeug zu drücken. Betrachten Sie diese Frage geschlossen danke Ihnen allen. – blank

Verwandte Themen