gpt4 book ai didi

c++ - 为什么指针的内容会改变?

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:21 28 4
gpt4 key购买 nike

我是一名 C# 程序员,现在使用 C++ 来完成一些工作。

pair<Point,double>* p=NULL;
Sphere* sphere=NULL;

for (int i=0;i<spheres.size();i++)
{
vector<pair<Point,double>> solution=findIntersection(Point(ray.origin),Point(ray.direction.x,ray.direction.y,ray.direction.z),spheres[i]);

if(solution.size()==0)
continue;


if(p==NULL || solution[0].second<p->second)
{
p=&solution[0];
sphere=&spheres[i];
}
}


if(p==NULL)
return backgroundColor;
else
{
Color c=localIlluminate(p->first,*sphere);
return c;
}

我要p.first具有最小值,并且 sphere是用于获得 p 的对应球体.

调试后,发现代码不能运行。在第一个循环中,p将被分配地址solution[0] ,假设值为 {(0,0),0}。然后循环继续,当i=1 ,假设 solution[0] 变为 {(1,2),3} 并且 p 的值也变为 {(1,2),3}。

我不期望 p 的值改变。我该如何解决?

最佳答案

您正在将对局部变量的引用存储在声明局部变量的范围之外。

每次迭代 solution 都不再有效,那么它的地址不应被视为有效。要获得你需要的东西,你应该按值分配变量,这样你就可以实际复制包含的值,例如:

pair<Point, double> p = std::make_pair(whatever, std::numeric_limits<double>::max());

for (...)
{
if (solution[0].second < p.second)
p = solution[0];
}

地址变化可能是由多种原因引起的,但你不必费心去理解为什么,避免这种情况就可以了。你的误解来自于 C# 有一个垃圾收集机制,它可以防止 solution[0] 变得无效,当在堆栈上声明变量时,这对于 C++ 是不正确的。

关于c++ - 为什么指针的内容会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24102353/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com