这是一个非常广泛的问题,所以我希望它能够适应S / O问题的指导原则。
基本上,我正在编写一个从场景文件中获取输入的Ray Tracer。现在,对于我的场景文件中定义的每个新三角形/球体,我在C ++中执行以下操作(希望代码是自解释的):
GeometricPrimitive* primitiveToAdd = new GeometricPrimitive();
Triangle* triangleToAdd = new Triangle(ax, ay, az, bx, by, bz, cx, cy, cz);
BRDFCoefficients *brdfToAdd = new BRDFCoefficients();
Color* kaToAdd = new Color(kar, kag, kab);
Color* kdToAdd = new Color(kdr, kdg, kdb);
Color* ksToAdd = new Color(ksr, ksg, ksb);
Color* krToAdd = new Color(krr, krg, krb);
brdfToAdd->ka = *kaToAdd;
brdfToAdd->kd = *kdToAdd;
brdfToAdd->ks = *ksToAdd;
brdfToAdd->kr = *krToAdd;
brdfToAdd->sp = ksp;
Material* materialToAdd = new Material();
materialToAdd->constantBRDF = *brdfToAdd;
primitiveToAdd->material = materialToAdd;
primitiveToAdd->shape = triangleToAdd;
aggregatePrimitive.addPrimitive(primitiveToAdd);
(aggregatePrimitive是一个具有。的全局变量
std::vector<GeometricPrimitive*>
listOfPrimitives;)
光线跟踪器在小例子上运行良好,但是当我尝试从.obj文件中启动一些更复杂的示例时,我的计算机运行它几分钟然后出现内存不足错误。我还启动了一个60GB的RAM EC2实例并在其上运行光线跟踪器,但它仍然耗尽内存。
起初我认为这只是因为光线追踪太慢而且实际上占用了太多的记忆。但它可能是别的吗?具体反复呼叫新? (我不确定在这种情况下动态分配内存的确切后果是什么。)60GB RAM EC2实例无法正常工作,这有点可疑...
同样,我意识到这是一个非常广泛且非具体的问题,但任何想法?
答案 0 :(得分:2)
具体反复拨打新电话?
是<!/强>
您没有释放任何这些资源。
对我来说,你应该完全避免new
。例如:
Color kaToAdd(kar, kag, kab);
肯定不需要动态分配。
如果你知道你需要动态分配,那么很好,但是当你完成这些资源时,请确保delete
这些资源,最好是通过{{{{ 1}}。