我正在尝试使用指针toRender在我的光线投射程序中存储最接近的三角形的地址。我的第一个打印语句表明它正在工作:打印出1,这是最接近的三角形的toRender->color.x的正确值。但是,一旦程序进入下一个打印语句,它将为toRender->color.x打印0。这是另一个三角形的颜色值,但重要的是,该像素未与该三角形相交(外循环的此迭代),并且第一个cout没有为此像素打印0。当我调试代码时,尽管toRender在两个print语句中给出了不同的值,但分配给toRender->color.x的地址保持不变。我不知道该怎么解决。

我不确定是否相关,但是world是一个函数参数:const std::vector<Triangle>& worldTriangle是一个结构。

        float minDist = 1000; // distance to closest sphere
        Triangle* toRender;

        // check for intersection with each triangle in the world
        for (Triangle triangle : world) {

            // distance to triangle
            double distTo;

            // distTo is set in intersectTriangle
            if(intersectTriangle(ray, triangle, distTo)){
                // set new minDist if closest
                if (distTo < minDist){
                    minDist = distTo;
                    toRender = &triangle;

                    cout << toRender->color.x << endl;

                }

            }
        }


        // don't render anything farther than 1000 away
        if(minDist < 1000) {
            cout << toRender->color.x << endl;
            // get color from closest shape
            double red = toRender->color.x * 255;
            double green = toRender->color.y * 255;
            double blue = toRender->color.z * 255;

            // set color
            color = make_colour(red, green, blue);

        }

最佳答案

triangle是一个变量,包含容器中对象的副本,范围是循环的。它在循环外不存在,因此分配给toRender的指针在循环后指向已破坏的对象。那是不确定的行为。

如果您打算让triangle引用容器中的一个对象而不是一个对象的副本,则使其成为引用(auto& triangle : ...

关于c++ - C++指针设置为地址,但莫名其妙地指向程序不同部分的不同值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49986903/

10-10 08:08