【发布时间】:2015-03-19 02:50:29
【问题描述】:
这是一个相当广泛的问题,所以我希望它符合 S/O 问题的松散准则。
基本上,我正在编写一个从场景文件中获取输入的光线追踪器。现在,对于我的场景文件中定义的每个新三角形/球体,我在 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 实例并在其上运行光线追踪器,但它仍然内存不足。
起初我认为这只是因为光线追踪器太慢了,而且实际上占用了太多内存。但它可能是别的东西吗?特别是对 new 的重复调用? (我不确定在这种情况下动态分配内存的确切后果是什么。)60GB RAM EC2 实例不起作用似乎有点可疑......
再次,我意识到这是一个非常广泛且不具体的问题,但有什么想法吗?
【问题讨论】:
-
我假设您在某些时候调用 delete 来释放这些内存。您运行 32/64 位的操作系统是什么?可执行文件是 32/64 位的吗?您可以提供任何其他信息吗?
-
可能你把它们都泄露了?
-
显然我不会删除
Color指针、BRDFCoefficients指针和Material指针,我应该这样做。但是,由于我在上面发布的评论,这真的是我的程序崩溃的原因吗? -
@RyanYu:你说你遇到了内存耗尽错误。而且,是的,当然,如果您不释放资源,您将耗尽内存。所以这就是你的程序崩溃的原因......
-
不要像这样使用
new。这不是 Java。
标签: c++ raytracing