【问题标题】:Segmentation Fault core dumped C++分段错误核心转储 C++
【发布时间】:2016-07-12 20:39:11
【问题描述】:

不知道为什么我在这段特定的代码行中遇到分段错误,我知道当您尝试访问您无权访问的内存部分时会遇到该错误,但我不知道出了什么问题.

我正在尝试在场景之间进行更改,并且通过将推动对象的函数放入向量中,我得到了分段错误(核心转储) ,这仅在我推动球体和平面时发生,当我将这两条线注释掉时它可以工作,但它当然不会渲染球体.. 有任何想法吗? 如果我删除“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));
        }
    }

【问题讨论】:

  • sn-p 代码很难阅读 - 似乎缺少大括号。如果缩进正确,则 Sphere、Plane 和 Light 对象的生命周期在 if 块之后结束。但是指向现在未定义内存的悬空指针存储在 sceneObjects 列表中,以后可能会被访问​​(并崩溃)。为什么不使用新的三角形?
  • 好点我把它改成了这个场景Objects.push_back(new Sphere(sphere,.825,green_ref)); sceneObjects.push_back(new Sphere(plane[0][0],plane[0][1], -1, m aroon)); lightSource.push_back(new Light(light,whiteLight));不是我得到不同的错误,但它不再是分段错误
  • 耶!下次发布一个最小完整可验证示例 (MVCE) stackoverflow.com/help/mcve 很重要,所以我们不必猜测。现在,继续你的下一个问题;-)

标签: c++ vector segmentation-fault


【解决方案1】:

这解决了它

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

但现在我又遇到了一个错误

错误:没有匹配函数调用“Sphere::Sphere(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

【讨论】:

  • 函数原型有引用(glm::vec3 &amp;),而函数定义没有(vec3)。
  • 没关系,我推球两次而不是推平面。认为这个问题已经结束,谢谢大家。
【解决方案2】:

您正在将基于堆栈的本地变量的地址推送到稍后添加动态分配对象的容器中。在这些变量被销毁后,您可能正在引用本地(sphereSceneplaneScene)。为所有分配的 Triangles 清理内存也是一个问题,因为您无法删除本地人的内存。

假设ObjectSphere 等的基础,则您不需要dynamic_cast 来存储指针。

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 2017-02-25
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多