我正在尝试使用指针toRender
来存储我的光线投射程序中最近三角形的地址。我的第一个print语句表明它正在工作:打印出1,这是最近三角形toRender->color.x
的正确值。但是,一旦程序进入下一个print语句,它就会为toRender->color.x
打印0。这是另一个三角形的颜色值,但重要的是,该三角形没有与此像素相交(这是外循环的迭代),并且第一个cout
没有为此像素打印0。当我调试代码时,分配给toRender
的地址保持不变,尽管toRender->color.x
在两个打印语句中给出了不同的值。我不知道如何解释这一点。
我不确定它是否相关,但world
是一个函数参数:const std::vector<Triangle>& world
,而Triangle
是一个结构。
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 = ▵
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);
}
答案 0 :(得分:2)
triangle
是一个变量,包含容器中对象的副本,其范围限定为循环。它不存在于循环外部,因此分配给toRender
的指针指向循环后的被破坏对象。这是未定义的行为。
如果您打算让triangle
在容器中引用对象而不是一个副本,请将其作为参考(auto& triangle : ...